1

以下はRubyでコンマフィケーションのために機能します(,数値を追加すると、に12345なります12,345

def r(s)
  s.gsub(/(?<=\d)(?=(\d\d\d)+\b)/, ",")
end

s = ""
1.upto(20) do |i|
  s += (i % 10).to_s
  puts r(s)
end

しかし、なぜバリエーションが機能r2r3ないのだろうか?

def r2(s)
  s.gsub(/(?<=\d)(?=(\d\d\d)+)\b/, ",")
end

def r3(s)
  s.gsub(/(?<=\d)(?=\d\d\d)+\b/, ",")
end

1234何も変更されていませんが、それは一致していると思う(?<=\d)(?=(\d\d\d)+)\bので、少し奇妙です。(私もPerlを使って試したので、Rubyに特有のものではありません)。

更新:以下は、の出力ですがrr2およびの出力はまったく追加されてr3いません。,

1
12
123
1,234
12,345
123,456
1,234,567
12,345,678
123,456,789
1,234,567,890
12,345,678,901
123,456,789,012
1,234,567,890,123
12,345,678,901,234
123,456,789,012,345
1,234,567,890,123,456
12,345,678,901,234,567
123,456,789,012,345,678
1,234,567,890,123,456,789
12,345,678,901,234,567,890
4

3 に答える 3

5

さて、r2では、先読みは次の3文字は数字でなければならないと言っていますが、すぐに単語の境界に一致させようとします。それらは相互に排他的です。

r3では、先読みを1回以上繰り返していますが、先読みであるため、これは意味がありません。「次の3文字は数字である必要があります」を何度も繰り返していますが、数字である場合とそうでない場合があります。それを複数回述べるのは無意味です。そして、あなたはまだ単語の境界に問題があります。

先読みは、スタック上のピーク関数のようなものです。何も消費しないため、ポインタを前方に移動しません。位置と一致します(文字間のスペースと考えてください)。したがって、先読みは3桁の数字が続く位置と一致しています。ただし、次のステートメント(\b)は、左側の文字が単語文字(通常、[a-zA-Z0-9_]またはそのようなもの)であり、右側の文字がそうでない(空白、ピリオドなど)、またはその逆の位置に一致します。前のルックビハインドでは位置の前に数字が必要であり、ルックアヘッドでは一連の数字が必要であるため、定義された位置に単語の境界を設定することは不可能です。

次の正規表現は常に失敗します。

^(?=\d\d\d)\d\d\b

^、一致は入力の先頭から開始する必要があることを示しています。先読みは、次の3文字は数字でなければならないと主張します(ただし、それらを消費しません)。次の式は、次の2文字は数字でなければならず(そしてそれらを消費し、ポインターを前方に移動し)、その後に数字以外の文字(単語の境界)が続くことを示しています。ただし、これは、次の3文字が数字でなければならないという先読みに違反します。したがって、一致は失敗します。

参照: http: //www.regular-expressions.info/lookaround.html

于 2012-10-26T14:10:57.697 に答える
1

r2が単語で言うことは、「3で割り切れ、その前に1桁の数字がある、単語の境界に一致する」ということです。これは矛盾です。境界の前後に数字を含めることはできないためです。それは境界ではありません。したがって、この式に一致するものはありません。

于 2012-10-26T14:15:04.417 に答える
0

r2単語の境界r3は、内側ではなく、先読みの直後にあります。数字を前に付けたいので、これは決して一致しません-それは確かに単語の中にあります。\b

+ところで、先読みは無効だと思います。先読みが一致する場合、もちろん繰り返し一致します。3桁の繰り返しが必要な場合は、先読みの内側にある必要があります。

于 2012-10-26T14:11:42.950 に答える