我正在尝试匹配Python样式的单行和多行字符串。 到目前为止,这是我要提出的内容:
public const string PythonString = @"(?<string>('''[^(''')]*''')|(""""""[^("""""")]*"""""")|("".*"")|('.*'))";
例如,当您在三重"
匹配字符串中包含单个"
时,它将失败:
"""
msg = "Nothing in this file is used in w3af. This was a test that was truncated by my personal\
lack of interest in using encryption here, my lack of time and the main reason: I'm lazy ;)\
Also, pyrijndael was only used here, so I removed the dependency, which was a problem for debian."
raise Exception(msg)
"""
在这里,字符串中的"
强制正则表达式在第一个三元组"
之后停止匹配,而不是匹配整个块。
我该如何解决?
答案 0 :(得分:2)
一个常见的误解是,将一个字符序列放入一个否定的字符类中会导致匹配除指定序列以外的一个字符序列。实际上,[^(''')]*
= [^)(']*
。
您需要在此处与否定的字符类一起使用前行:
@"(?s)(?<string>('''[^']*(?:'(?!'')[^']*)*''')|(""""""[^""]*(?:""(?!"""")[^""]*)*"""""")|(""[^""\\]*(?:\\.[^""\\]*)*"")|('[^'\\]*(?:\\.[^'\\]*)*'))"
[^']*(?:'(?!'')[^']*)*
匹配
[^']*
-除'
以外的任何0+个字符(?:'(?!'')[^']*)*
-0个以上的序列:
'(?!'')
-一个'
后没有两个'
字符[^']*
-'
以外的任何0+个字符。匹配单引号文字时,您需要考虑转义字符,因此在模式内的引号之间需要[^'\\]*(?:\\.[^'\\]*)*
:
[^'\\]*
-除'
和\
以外的任何0+个字符(?:\\.[^'\\]*)*
-零个或多个序列
\\.
-一个\
后跟任意字符[^'\\]*
-除'
和\
以外的任何0+个字符