【问题标题】:Regular expression does not work as intended正则表达式无法按预期工作
【发布时间】:2018-08-30 20:56:34
【问题描述】:

我正在尝试匹配 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)
"""

这里,字符串中的" 强制正则表达式在第一个三元组-" 之后停止匹配,而不是匹配整个块。 我该如何解决这个问题?

【问题讨论】:

  • 您能否展示一些示例输入的预期输出?
  • 一个常见的误解是,将一个字符序列放入一个否定的 char 类中会导致匹配一个字符序列而不是定义的序列。事实上,[^(''')]* = [^)(']。所以,你需要@"(?s)(?&lt;string&gt;('''[^']*(?:'(?!'')[^']*)*''')|(""""""[^""]*(?:""(?!"""")[^""]*)*"""""")|(""[^""\\]*(?:\\.[^""\\]*)*"")|('[^'\\]*(?:\\.[^'\\]*)*'))"
  • @WiktorStribiżew 谢谢!有用。你能解释一下(?:'(?!'')[^']*)* 的作用吗?

标签: c# regex


【解决方案1】:

一种常见的误解是,将字符序列放入否定字符类中会导致匹配指定序列以外的字符序列。事实上,[^(''')]* = [^)(']*

您需要在此处与否定字符类一起使用前瞻:

@"(?s)(?<string>('''[^']*(?:'(?!'')[^']*)*''')|(""""""[^""]*(?:""(?!"""")[^""]*)*"""""")|(""[^""\\]*(?:\\.[^""\\]*)*"")|('[^'\\]*(?:\\.[^'\\]*)*'))"

[^']*(?:'(?!'')[^']*)* 匹配

  • [^']* - 除' 之外的任何 0+ 个字符
  • (?:'(?!'')[^']*)* - 0+ 个序列:
    • '(?!'') - ' 后面没有两个 ' 字符
    • [^']* - 除 ' 之外的任何 0+ 个字符。

在匹配单引号文字时,您需要考虑转义字符,因此您需要在模式内的引号之间添加[^'\\]*(?:\\.[^'\\]*)*

  • [^'\\]* - 除 '\ 之外的任何 0+ 个字符
  • (?:\\.[^'\\]*)* - 零个或多个序列
    • \\. - \ 后跟任何字符
    • [^'\\]* - 除 '\ 之外的任何 0+ 个字符

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多