2

以下は一致しているよう, です 誰かが理由を説明できますか?

カンマで終わる複数の数値またはポイントに一致させたいです。

 123.456.768,
 123,
 .,
 1.2,

しかし、次のことを行うと予期せず印刷され,ます

my $text = "241.000,00";
foreach my $match ($text =~ /[0-9\.]+(\,)/g){
    print "$match \n";
}
print $text; 

# prints 241.000,
#        ,

更新:
コンマが一致した理由: ここでIn list context, //g returns a list of matched groupings, or if there are no groupings, a list of matches to the whole regex 定義されているとおり

4

5 に答える 5

4

foreach ループでの一致は、リスト コンテキストにあります。リスト コンテキストでは、一致するとキャプチャされたものが返されます。括弧は、正規表現全体ではなく、キャプチャを示します。コンマの周りに括弧があります。あなたはそれを逆にしたい、彼があなたが望むビットの周りに括弧を置きます.

my $text = "241.000,00";

# my($foo) puts the right hand side in list context.
my($integer_part) = $text =~ /([0-9\.]+),/;

print "$integer_part\n";  # 241.000
于 2012-11-21T21:35:16.477 に答える
4

ゼロ幅の正の先読みアサーションを使用して、一致自体からコンマを除外します。

$text =~ /[0-9\.]+(?=,)/g
于 2012-11-21T21:36:04.963 に答える
3

コンマを一致させたくない場合は、先読みアサーションを使用します。

/[0-9\.]+(?=,)/g
于 2012-11-21T21:35:26.430 に答える
2

あなたは間違ったものを捉えています!かっこをコンマの周りから数字の周りに移動します。

$text =~ /([0-9\.]+),/g
于 2012-11-21T22:20:14.580 に答える
1

コンマを先読みに置き換えるか、キャプチャしたいものの一部ではないため、コンマを完全に除外することができます。この場合、違いはありません。ただし、このパターンは数字の代わりにコンマをそのままキャプチャ グループ 1 に入れ、キャプチャ グループによる参照さえせず、代わりに一致全体を返します。

これは、キャプチャ グループを取得する方法です。

$mystring = "The start text always precedes the end of the end text.";
if($mystring =~ m/start(.*)end/) {
    print $1;
}
于 2012-11-21T21:49:14.613 に答える