【问题标题】:My regular expression matches too much. How can I tell it to match the smallest possible pattern? [duplicate]我的正则表达式匹配太多。我怎样才能告诉它匹配最小的可能模式? [复制]
【发布时间】:2011-10-24 07:13:33
【问题描述】:

我有这个正则表达式:

('.+')

它必须匹配 C 中的字符文字。例如,如果我有 'a' b 'a',它应该匹配 a 和它们周围的 '

但是,它也与b 匹配(它不应该),可能是因为严格来说,它也在' 之间。

这是出错原因的屏幕截图(我用它来突出显示语法):

我对正则表达式相当陌生。我怎样才能告诉正则表达式不匹配这个?

【问题讨论】:

    标签: regex


    【解决方案1】:

    它是贪婪的,匹配第一个撇号和最后一个撇号以及介于两者之间的所有内容。

    这应该匹配任何不是撇号的东西。

    ('[^']+')
    

    另一种选择是尝试非贪婪匹配。

    ('.+?')
    

    【讨论】:

    • 谢谢,这行得通。正则表达式中的“贪婪”究竟是什么意思?
    • 不适用于'\'',它是 C 中的字符文字(正如问题所述,它需要匹配它们)。`
    • 这个页面,regular-expressions.info/repeat.html,比我能解释的更好。基本上贪婪的时候会尽量匹配。
    • @sidyll 或者 ('([^'\\]|\\.)*') 那么呢?它奏效了。
    【解决方案2】:

    您是否尝试过非贪婪版本,例如('.+?')?

    匹配(或两组量词)通常有两种模式,最大(贪婪)和最小(非贪婪)。第一个将导致可能的最长匹配,而后者将导致最短的匹配。您可以在Perl Cookbook(第 6.15 节)中了解它(尽管在 perl 上下文中)。

    【讨论】:

    • 这对于兼容 Perl 的正则表达式来说是个好建议,但对于其他正则表达式方言来说却是一个错误(通常只是默默地失败)。
    【解决方案3】:

    试试:

    ('[^']+')
    

    ^ 表示包括除方括号中的字符之外的所有字符。这样,它不会匹配'a' b 'a',因为两者之间有一个',所以它会给出'a' 的两个实例

    【讨论】:

    • 您的示例中的 ^ 被用作锚点。它需要在括号内才能按预期工作。
    【解决方案4】:

    你需要转义引号:

    \'[^\']+\'
    

    编辑:嗯,我想这个答案取决于您使用的语言/系统。

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    相关资源
    最近更新 更多