1

文字列内の 2 つの 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 に答える