【问题标题】:Cases where possessive and greedy quantifiers of `*+` and `*` give different results?`*+` 和 `*` 的所有格和贪婪量词给出不同结果的情况?
【发布时间】:2018-01-11 06:07:52
【问题描述】:

我在看这个问题Greedy vs. Reluctant vs. Possessive Quantifiers

我可以看到*+* 都匹配零次或多次,但所有格量词*+ 将尽可能匹配前向。* 将匹配.* 和回溯。我可以接受*+.* 字符串较长时会更有效。

我对他们何时给出不同的结果很感兴趣。

我看到了一条评论

@moodboom,有零个案例(数学事实) 所有格量词将产生一个不会产生的匹配 通过简单的贪婪量词。偶尔会有他们 当贪婪量词产生匹配时,将产生不匹配。 对于所有其他情况(贪婪和所有格产生相同的 结果),所有格量词会提高性能。 – 通配符 5月5日23:00

我很想看到这个扩展,占有和贪婪量词给出不同结果的具体情况。

对比*+*

我也对可能的不同结果感兴趣,对比 ?+?

【问题讨论】:

  • 嗯,我是想回答这个问题,但没有解决。现在在移动设备上,但明天可能可以这样做。
  • @Wildcard 谢谢。只要你有时间就可以了
  • 非常相关(带有不同匹配的示例,以及对答案中错综复杂的许多精美解释):stackoverflow.com/questions/5319840/…
  • @DewiMorgan 我在第一行提到了一个,它可以作为帮助理解这个问题的基础,但是这个问题很笼统,那里的答案没有涵盖这个问题。

标签: regex


【解决方案1】:

查看演示中的示例以获取测试字符串aaabaaax 尝试贪婪模式a*[^b] 和所有格模式a*+[^b]

Demo 1

Demo 2

a*[^b] 将回溯以尝试找到匹配项,因此它在 aaab 中找到 aaa

a*+[^b] 将找到aaa 不会回溯,并会尝试匹配[^b],在aaab 上失败

【讨论】:

  • 我询问了结果不同的示例,您刚刚将两者描述为找到听起来像相同结果的“aaa”。我知道过程不同,但我要求提供不同结果的示例。你也没有涵盖我写的最后一行。
【解决方案2】:

我找到了一个案例,但我不确定解释和针对性。而且我认为还有很多其他情况。

测试用例

greedy = /.*b/
posssessive = /.*+b/

测试于:

傻瓜

只有贪心匹配它。

说明

Possessive 将首先匹配整个字符串 (.*+),然后尝试匹配b char 但只找到字符串结尾($)。

Greedy 也会匹配整个字符串,但会向后看,直到找到第一个 b 字符。它会找到的。

【讨论】:

  • 你说你在 foo 和 foob 上测试过。您是否同意我通过删除foo 的示例来简化您的答案,但保留foob 之一的原因是贪婪和所有格对 foo 给出相同的结果(不匹配),所以 foo 无关紧要.相关的是你的第二个例子 - foob。如果没有 'foo' 示例,您的答案会更简单、更清晰 'cos foo 并不是我所要求的示例。另一方面,'foob' 是。
  • UPVOTED 你发现 re foob 真是太棒了,这也是一个如此简单的测试用例。
  • 我同意你的观点,事实上,当我写完这篇文章时,我想删除第一个例子。这真的是您对答案的期望吗?我在写的时候不确定。
  • 我很高兴你删除了非示例,是的,你的答案回答了这个问题,到目前为止,它是问题的唯一答案(alpha bravo 的答案尝试表明他甚至没有理解问题)。虽然是的,但我确定如果合适的人停下来,我会得到一个可能更深入的答案,但这是迄今为止唯一的答案。
猜你喜欢
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多