【问题标题】:My regex is matching before expected我的正则表达式在预期之前匹配
【发布时间】:2019-01-14 23:40:36
【问题描述】:

我知道使用正则表达式解析 html 是不受欢迎的,但这是我想首先尝试的解决方案。

我正在尝试匹配

what a great sentence this is

以及这些单词之间的任何字符或间距

在以下字符串中:

<p>
  what is going on with you?
</p>
<p>
  what a great
</p>
<p>
  sentence this is
</p>
<p>
  How is your family?
</p>

我使用的正则表达式是:

what.*a.*great.*sentence.*this.*?is

我知道 .*?在'is'阻止我的正则表达式匹配最终p标签中的'How is'之前。但我不知道在开头附近放什么来阻止比赛从第一个 p 标签中的“正在发生的事情”开始

我正在查看来自 https://regex101.com/r/kZWYR7/1 的输出,以确认它没有按预期工作。

请帮忙,我觉得正则表达式缺少一个重要的教训,这使我无法弄清楚这一点。

预期的匹配是:

what a great
    </p>
    <p>
      sentence this is

编辑:澄清我的问题以及它与重复的问题有何不同

【问题讨论】:

  • 试试what\W*a\W*great\W*sentence\W*this\W*is。你期望单词之间有什么样的字符? \W 是任何非单词字符(包括空格)。如果您只想允许空格,请使用\s 而不是\W
  • 这是什么原因,你在说话之间使用了.*
  • 您可以使用正则表达式匹配what a great sentence this is what a great sentence this is
  • Stack overflow when trying to use regex in java 的可能重复项。 注意: 答案也涵盖此处发布的问题。
  • 在这种情况下试试这个:what[^.?]*?a[^.?]*?great[^.?]*?sentence[^.?]*?this[^.?]*?is

标签: java regex string regex-greedy non-greedy


【解决方案1】:

要将纯文本与正则表达式中的字符串的一部分进行匹配,只需使用您要查找的文本即可。匹配what a great sentence this is 应该可以工作,不需要.*。之后的.* 允许字符串的其余部分在is 之前为任何内容。

编辑:我刚刚通读了您的 cmets,发现单词之间可能存在空格。在这种情况下,@WiktorStribiżew 是对的,在每个单词之间使用 \W* 以适应单词之间任意数量的 非单词字符。 (再次感谢@WiktorStribiżew)

正如@Jonathan Buelow 指出的那样,如果只是单词之间的空格,您可以使用\s+\s* 代替: what\s+a\s+great\s+sentence\s+this\s+is

【讨论】:

  • \s 匹配空格,\W 匹配任何非单词字符。
  • 紧接着,\s+ 也解决了多个空格的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
相关资源
最近更新 更多