【问题标题】:Regex greedy issue正则表达式贪婪问题
【发布时间】:2008-10-16 20:07:50
【问题描述】:

我确信这个很简单,但我尝试了很多变化,但仍然无法满足我的需要。事情太贪婪了,我无法让它停止贪婪。

给定文字:

test=this=that=more text follows

我只想选择:

test=

我尝试了以下正则表达式

(\S+)=(\S.*)
(\S+)?=
[^=]{1}
...

谢谢大家。

【问题讨论】:

  • 您说您只想选择“text=”,但这不会出现在您的示例文本中!
  • wooops.. 你是对的.. 它应该是 test=.. 我会编辑它

标签: regex regex-greedy


【解决方案1】:

这里:

// matches "test=, test"
(\S+?)=

or

// matches "test=, test" too
(\S[^=]+)=

您应该考虑使用第二个版本而不是第一个版本。给定您的字符串"test=this=that=more text follows",版本1 将匹配test=this=that=,然后继续解析到字符串的末尾。然后它会回溯,找到test=this=,继续回溯,找到test=,继续回溯,最后选择test=

版本 2 将匹配 test= 然后停止。您可以在多行或整个文档匹配等大型搜索中看到效率提升。

【讨论】:

    【解决方案2】:

    你可能想要类似的东西

    ^(\S+?=)

    插入符号 ^ 将正则表达式锚定到字符串的开头。这 ?在 + 之后使 + 不贪婪。

    【讨论】:

      【解决方案3】:

      您可能正在寻找lazy quantifiers *?、+?、?? 和 {n, n}?

      【讨论】:

        【解决方案4】:

        你应该可以使用这个:

        (\S+?)=(\S.*)
        

        【讨论】:

        • 我可以发誓我尝试了所有这些变体。我切换到 gui 正则表达式编辑器进行测试,但它似乎并不“正常工作”。我添加了?进入我的代码,一切都很好。谢谢大家!
        • 这实际上将在第一组中获得“文本”,在第二组中获得“this=that=more text follow”。 Owen's 会在两组中得到“text=”和“text”。我假设他希望根据他之前的尝试去掉 =。
        【解决方案5】:

        惰性量词有效,但由于回溯,它们也可能会影响性能。

        考虑一下你真正想要的是“一堆不等于,一个等于,还有一堆不等于。”

        ([^=]+)=([^=]+)
        

        您的[^=]{1} 示例仅匹配单个不等于字符。

        【讨论】:

          【解决方案6】:

          如果你只想要"text=",我觉得很简单:

          ^(\w+=)
          

          如果您确信字符串“text=”将始终作为该行的开头,那应该没问题。

          真正的问题是当字符串是这样的:

          this=that= more test= 文字如下

          如果您使用上面的正则表达式,结果是“this=”,如果您在最后使用中继器限定符修改上面的内容,如下所示:

          ^(\w+=)*
          

          你发现了一个巨大的“this=that=",所以我只能想象琐碎的事情:

          [th\w+=]*test=
          

          再见。

          【讨论】:

            猜你喜欢
            • 2011-01-22
            • 2019-07-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多