【问题标题】:What's the second match after the whole string with /.*/? [duplicate]整个字符串之后的第二个匹配 /.*/ 是什么? [复制]
【发布时间】:2019-07-08 02:26:26
【问题描述】:

我在 Ruby 中的正则表达式中得到了这个结果。

起初,问题本身并不相同。 这不是同一个问题,因为答案不同。 评论中的讨论也有所作为。

在第一个结果中,在匹配整个 'hello' 之后,它看起来 .* 匹配 nothing

但是为什么会这样呢?

[53] pry(main)> "hello".gsub(/.*/, "abc")
=> "abcabc"
[54] pry(main)> "hello".gsub(/^.*$/, "abc")
=> "abc"

【问题讨论】:

  • 为什么会分成'hel'和'lo'?
  • @JayRizzo "hello".gsub(/.*/) { puts $&.inspect; "abc" } 另有说法。
  • 有趣的是,您只需要在开头锚定它即可使其“有意义”:"hello".gsub(/^.*/, "abc")"hello".gsub(/\A.*/, "abc")。最后用$\z\Z 锚定没有任何作用。使用gsub(/.+/) 当然会产生预期的结果。大概.* 匹配字符串末尾的“无”,因为* 表示“零或更多”
  • 不是答案,但这里有一些数据。在 rubular.com 有一个匹配项,即整个字符串。在 regex101.com,没有选项,只有一个匹配项。添加“全局”/g 选项(“第一次匹配后不返回”)有两个匹配项,一个是“空匹配项”。但是,Ruby 不支持/g
  • Hidehiro,请参阅@matiska 对this SO quesion 的回答。

标签: regex ruby


【解决方案1】:

重要的是,一个正则表达式永远不能在同一位置匹配两次。比赛也不能重叠。此外,请注意"hello" 中涉及六个可能的位置:一个在每个字符的开头,一个在末尾(参见fenceposting)。

当您开始搜索/.*/ 时,在位置 0 处有一个匹配项,它占用五个字符。这将取消位置 0、1、2、3 和 4 的进一步匹配(因为它们是第一个匹配的一部分)。

第二个匹配从位置 5 开始匹配,并找到“0 个或多个字符”的匹配项 - 即 0 个字符。位置 5 不包含在第一场比赛中,因此不会被“不重叠”规则取消资格。


当您使用/^.*/ 锚定起点时,位置 5 将变为不合格,因为它不是起点。

当您使用/.*$/ 锚定结尾时,位置 0 和位置 5 将分别检测到在它们的 5 个字符或 0 个字符匹配之后它们位于搜索字符串的末尾,因此您仍然会得到两个匹配项.

当您使用/.+/ 将正则表达式更改为“1 个或多个字符”时,位置 5 再次不合格,因为没有更多字符可以匹配,但至少需要 1 个。


还要注意,不仅仅是 Ruby,在我测试的所有引擎中都发现了相同的行为。 Python 的 sub 有点不一致(可能是因为它的邻接条件?不确定),但 findall 报告相同的两个匹配项:

re.findall('.*', 'hello') # => ['hello', '']

JavaScript 像 Ruby 一样工作:

"hello".replace(/.*/g, "abc") // => "abcabc"

Java 也是如此:

"hello".replaceAll(".*", "abc") // => "abcabc"

甚至是 PHP(使用 PREG):

preg_replace('/.*/', 'abc', 'hello'); # => "abcabc"

【讨论】:

  • 很好的答案!我学到了很多。
  • 非常感谢!!我可以问一个问题吗?为什么第一个匹配项不包含位置 5?换句话说,为什么第一场比赛停在第 4 位?
【解决方案2】:

这是因为正则表达式引擎不会返回,这意味着当它匹配某些文本时,它永远不会返回匹配的文本内部,即 matvhes 不会重叠。

你使用了*量词,意思是它是贪婪的,所以会尽可能匹配。如果你使用*?,那么你会在字符串的每个位置都得到匹配,因为? 使它不贪婪,所以它至少会匹配。虽然* 表示零个或多个字符,但您会得到长度为 0 的匹配项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2017-11-04
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多