为什么Regexps只找到一个匹配,实际上还有更多?

时间:2015-12-18 03:50:07

标签: regex

如果实验的文字是“aaa” 和正则表达式模式“(a)+” - 为什么我只得到一个匹配:“aaa”?

为什么我没有:

  • “a”,“aa”,“aaa”(全部从位置0开始)
  • “a”(从位置1开始)
  • “aa”(从位置1开始)
  • “a”(从第2位开始)?

我是否应该记住找到一个匹配的假想光标 - 移动到它的末尾,然后新搜索从新位置开始?

如果我没弄错的话,它与所谓的懒惰量化器无关。

如果我使用“(a)+?”而不是第一个模式,我得到3个匹配,这实际上是你期望的。但它与我之前描述的内容无关。

是否有可能获得所有直接的事件?

2 个答案:

答案 0 :(得分:1)

在字符串中查找匹配项通常以大多数(如果不是全部)语言的方式工作。它在字符串的开头开始匹配。它尝试匹配正则表达式并在找到匹配字符时移动“光标”。一旦找到匹配,它将从下一个字符再次开始,它不会将“光标”移回。

另请注意,量词有两种类型的匹配(+是量词之一)。贪婪将匹配尽可能多的字符(在您的示例中为aaa)并尽可能少地保持懒惰(在您的示例中为a)。但是aa的匹配是不可能的 - 它既不贪婪也不懒惰。

使用一些编程语言构造除了正则表达式之外,可能有可能获得您希望看到的所有匹配项。你还需要限制匹配的界限,以实现你的非贪婪和懒惰的匹配。

答案 1 :(得分:0)

这被称为"贪心"比赛。这是[你的]正则表达式如何运作。

(a)+说[实际上],如果您找到a [+表示"一个或更多"],继续追加任何邻接的a s,直到找不到[邻接] a - 然后[然后才会]出现匹配。因此,"贪婪"。

获得你想要/期望的东西将需要更复杂的正则表达式,可能在perl / awk / python / etc中的循环内。脚本。

也就是说,你进行初始匹配然后使用循环,从匹配文本中输出你想要的所有东西。