1

我需要在字符串中的双 EOL 之后插入一些额外的文本。我遇到了奇怪的行为:当我在双 EOL 之后积极预测符号的出现时,一切工作几乎都很好:

"A\n\nA".gsub /(^{2})(?=A)/, '♻'
# ⇒ "♻A\n\n♻A"

在(字符串的开头)有一个奇怪的匹配\A,但我现在没问题。当我尝试负前瞻时,真正的问题出现了:

"A\n\nA".gsub /(^{2})(?!B)/, '♻'
# ⇒ "♻A\n♻\n♻A"
# WHAT?  ⇑

请您解释一下我在正则表达式中误解了什么,为什么会出现中间匹配以及我应该如何用我需要的东西代替双 EOL。

UPD发生中间匹配是因为^是元字符,不匹配,谢谢@bsd。但是,替代双 EOL 的正确方法是什么?我很可能被困住了。

提前致谢。

4

1 回答 1

2

我认为你错误地认为^可以贪婪地匹配。^ 匹配行首。

^也是一个匹配字符之间零宽度位置的元字符。连续换行符/起始字符之间有多少个零宽度位置?它可能会在每个字符之前匹配。

看这个

"A\n\nA".scan /(^{2})(?!C)/
=> [[""], [""], [""]]

你可能是故意的

"A\n\nA".gsub /([\n]{2})(?!C)/ , "\\1♻'"
=> "A\n\n♻A"

编辑:

因此,如果您想在所有平台上使用它。你可以把它写成:

"A\r\n\r\nA".gsub /((?:\r?\n){2})(?!C)/ , "\\1♻"
=> "A\r\n\r\n♻A"

"A\n\n\n\nA".gsub /((?:\r?\n){2})(?!C)/ , "\\1♻"
=> "A\n\n♻\n\n♻A"

Edit2:@Alan Moore 说在 Ruby 2.0 中,您可以将上述正则表达式简化为

"A\n\n\n\nA".gsub /(\R{2})(?!C)/ , "\\1♻"
于 2013-10-05T08:04:14.330 回答