3

私の正規表現は、私が何をしても、行の最後のアルファベット文字セットと一致します。最初の出現のみに一致させたい。

貪欲でない演算子を使用してみましたが、それは頑固に右端のアルファ文字セットに一致します。この場合、$1 に値「Trig」を与えますが、これは私が望むものではありません。$1 を「02.04.07.06 Geerite」にしたい。

コード

elsif ($line =~ /\s(\d{2}\.\d{2}\.\d{2}\.\d{2}\s[[:alpha:]]*?)/)
{
    print OUTPUT "NT5 " . $1 . " | | \n";
}

ソース

02.04.07.06 Geerite Cu8S5 R 3m、R 3m、または R 32 Trig

出力

NT2 32 トリガー | | |

つまり、次の出力が必要です。

NT2 02.04.07.06 ゲーライト | | |

4

4 に答える 4

1

これはあなたのために働くはずです:

perl -e '$_ = "02.04.07.06 Geerite Cu8S5 R 3m, R 3m, or R 32 Trig"; print "$1\n" if /(\d\d\.\d\d\.\d\d\.\d\d \w+)/'

プリント:

02.04.07.06 Geerite

正規表現自体:

/(\d\d\.\d\d\.\d\d\.\d\d \w+)/
于 2011-12-08T14:57:25.127 に答える
1

貪欲[[:alpha:]]にする:

$line = '   02.04.07.06 Geerite Cu8S5 R 3m, R 3m, or R 32 Trig';
if ($line =~ /\s(\d{2}\.\d{2}\.\d{2}\.\d{2}\s[[:alpha:]]*)/) {
    print OUTPUT "NT5 " . $1 . " | | \n";
}

出力

NT5 02.04.07.06 Geerite | |
于 2011-12-08T14:59:55.497 に答える
1

あなたのコードを

$line="     02.04.07.06 Geerite Cu8S5 R 3m, R 3m, or R 32 Trig ";
if ($line =~ /\s(\d{2}\.\d{2}\.\d{2}\.\d{2}\s[[:alpha:]]*?)/) { print "NT5 ".$1." | | \n"; }

私はこの出力を得る:

NT5 02.04.07.06  | | 

* を貪欲にしないようにすると、Geerite という単語が出力に含まれます。

観測された出力は、おそらく if-elsif-else ツリーの別のブランチからのものです。

于 2011-12-08T14:53:49.360 に答える
1

あなたの正規表現は「32 Trig」と一致しません。他に何か問題があるはずです。

サンプル文字列の先頭にスペースを追加し、最後の量指定子の後に貪欲でないものを削除すると、?必要な出力が生成されます。

$line =~ /\s(\d{2}\.\d{2}\.\d{2}\.\d{2}\s[[:alpha:]]*)/

[[:alpha:]]*?一致する文字数をできる限り少なくするため、これ以上パターンに従う必要がないため、一致する文字は 0 文字になります。

于 2011-12-08T15:02:04.440 に答える