「これらのパターンマッチ変数はスカラーであり、そのため、単一の値のみを保持します。その値は、キャプチャ括弧が一致するものであれば何でも 過去."
http://blogs.perl.org/users/sirhc/2012/05/repeated-capturing-and-parsing.html
あなたの例では、 $1
マッチ 1.2.3
. 。パターンが繰り返されると、 $2
に設定されます .2
の最終試合まで .3
質問
私はグループを使用して特定のパターンに合わせようとしていますが、私が期待している結果はまったく得られていません。関心のあるパターンは次のとおりです。
([0-9]+(\.[0-9]+)+)
文字列用 1.23
, 、私は得ます $1=1.23
, 、 と $2=.23
それは私にとって理にかなっています。
しかし、文字列用 1.2.3
, 、私は得ます $1=1.2.3
と $2=.3
, 、私が期待する場所 $2=.2.3
, 、そのグループは小数点と数字であるため、繰り返されるからです。
誰かがこれがどのように機能するかを私に説明してもらえますか?ありがとうございました!
解決 2
「これらのパターンマッチ変数はスカラーであり、そのため、単一の値のみを保持します。その値は、キャプチャ括弧が一致するものであれば何でも 過去."
http://blogs.perl.org/users/sirhc/2012/05/repeated-capturing-and-parsing.html
あなたの例では、 $1
マッチ 1.2.3
. 。パターンが繰り返されると、 $2
に設定されます .2
の最終試合まで .3
他のヒント
量量ファイアを使用してキャプチャグループを使用する場合、 過去 キャプチャされたパターンの繰り返しが保存されます。
おそらく、この正規表現はあなたのニーズを満たすでしょう:
\b(\d+)((?:\.\d+)+)\b
このregexは、主要な整数シーケンスを繰り返し分数成分から分離します。
(@ysthで示されているように、 \d
五月 より多くの文字を一致させます あなたが意図するよりも。その場合は、キャラクタークラスを使用してください [0-9]
代わりに、または使用します /a
修飾子.)
これは、サンプルデータセットでこのregexを実証するPERLプログラムです。 (も参照してください ライブデモ.)
#!/usr/bin/perl -w
use strict;
use warnings;
while (<DATA>) {
chomp;
# A - A sequence of digits
# B - A period and a sequence of digits
# C - Repeat 'B'.
if (/\b(\d+)((?:\.\d+)+)\b/) {
# ^^^ ^^^^^
# A B
# ^^^^^^^
# C
print "[$1] [$2]\n";
}
}
__END__
1.23
123.456
1.2.3
1.22.333.444
予想出力:
[1] [.23]
[123] [.456]
[3] [.2.3]
[4] [.22.333.444]