2009-08-18 5 views
0

Contract.Require 문 안에 있지 않으면 C# 파일 집합의 모든 문자열을 찾아야합니다. 문자열에 텍스트의 양이있을 수 있으므로 "and"와 문자열과 Contract.Require 사이의 모든 텍스트 사이에 텍스트가있을 수 있습니다.정규 표현식에 단어가 없습니다.

나는이있다 :

문자열을 발견,하지만 난 내 검색을 구체화 할 필요가
/".+"/ 

.

이것도 가능합니까?

+0

무엇을 같은 줄에 두 개의 문자열이있는 경우 어떻게됩니까? 이스케이프 된 "문자열 안에 있으면 어떨까요? –

+0

일반 문법이 아니기 때문에 안정적으로 작동하지 않을 수 있습니다. – annakata

+0

주석 처리 된 문자열이 있으면 어떻게됩니까? –

답변

1

정말로 정규 표현식을 사용하려면 음수 lookbehind를 사용하여 문자열 앞에 Contract.Require이 오지 않도록 할 수 있습니다. 그러나이 솔루션에는 많은주의 사항 (예 : commen 등)이 있으므로 최선의 선택이 아닐 수 있습니다.

import re 
reg = re.compile('(?<!Contract\.Require\()"([^"\\\]|\\\.)*"') 
tests = [ 'Contract.Require("test string")', 
      'OtherRequire("test string" + someVar)', 
      'String var = "testString";', 
      'String another = "test\\"quotestring"', 
      'String empty = ""' ] 

for test in tests: 
    m = reg.search(test) 
    print test, "wasn't matched." if m == None else "matched " + m.group(0) + "." 

출력 :

Contract.Require("test string") wasn't matched. 
OtherRequire("test string" + someVar) matched "test string". 
String var = "testString" matched "testString". 
String another = "test\"quotestring" matched "test\"quotestring". 
String empty = "" matched "". 

식의 lookbehind 위 입니다 어쨌든, 여기 파이썬에서 비슷한을 사용하는 간단한 데모 (당신이에게 그것을 적응 필요)입니다 (?<!Contract\.Require\()이고 문자열 리터럴과 일치하는 정규식은 "([^"\\\]|\\\.)*"입니다. 문자열 리터럴이 약간 더 복잡한 정규식은 "같은"따옴표 \ "따옴표로 문자열을 일치시킬 수하기 위해 필요합니다.

그것이 도움이되기를 바랍니다.

관련 문제