質問

私はグループを使用して特定のパターンに合わせようとしていますが、私が期待している結果はまったく得られていません。関心のあるパターンは次のとおりです。

([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]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top