Contract.Require 문 안에 있지 않으면 C# 파일 집합의 모든 문자열을 찾아야합니다. 문자열에 텍스트의 양이있을 수 있으므로 "and"와 문자열과 Contract.Require 사이의 모든 텍스트 사이에 텍스트가있을 수 있습니다.정규 표현식에 단어가 없습니다.
나는이있다 :
문자열을 발견,하지만 난 내 검색을 구체화 할 필요가/".+"/
.
이것도 가능합니까?
Contract.Require 문 안에 있지 않으면 C# 파일 집합의 모든 문자열을 찾아야합니다. 문자열에 텍스트의 양이있을 수 있으므로 "and"와 문자열과 Contract.Require 사이의 모든 텍스트 사이에 텍스트가있을 수 있습니다.정규 표현식에 단어가 없습니다.
나는이있다 :
문자열을 발견,하지만 난 내 검색을 구체화 할 필요가/".+"/
.
이것도 가능합니까?
정말로 정규 표현식을 사용하려면 음수 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\()
이고 문자열 리터럴과 일치하는 정규식은 "([^"\\\]|\\\.)*"
입니다. 문자열 리터럴이 약간 더 복잡한 정규식은 "같은"따옴표 \ "따옴표로 문자열을 일치시킬 수하기 위해 필요합니다.
무엇을 같은 줄에 두 개의 문자열이있는 경우 어떻게됩니까? 이스케이프 된 "문자열 안에 있으면 어떨까요? –
일반 문법이 아니기 때문에 안정적으로 작동하지 않을 수 있습니다. – annakata
주석 처리 된 문자열이 있으면 어떻게됩니까? –