正则表达式之前没有一个字

时间:2009-08-18 21:18:37

标签: regex string

我需要查找一组c#文件中的所有字符串,除非它们在Contract.Require语句中。字符串中可能有任意数量的文本,因此在“和”之间,以及字符串和Contract.Require之间的任何数量的文本。

我有这个:

/".+"/

找到字符串,但我需要优化搜索。

这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

如果您真的想使用正则表达式,可以使用负向lookbehind来确保您的字符串前面没有Contract.Require。但是,这个解决方案中有许多警告(例如commen等等),所以它可能不是你最好的选择。无论如何,这是一个简单的演示(你需要适应它)在Python中使用类似的东西:

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\() ,匹配字符串文字的正则表达式是 "([^"\\\]|\\\.)*" 。为了能够匹配诸如“quote \”quote“之类的字符串,需要这个稍微复杂的字符串文字正则表达式。

希望它有所帮助。