0

私は文字列を持っています:

set a "ODUCTP-1-1-1-2P1"
regexp {.*?\-(.*)} $a match sub

sub の値は 1-1-1-2P1 になると思います

しかし、私は空の文字列を取得しています。正規表現を適切に使用する方法を教えてもらえますか?

4

2 に答える 2

3

問題は、使用されている RE エンジン (スタックベースではなくオートマトン理論) の特徴である、 の非貪欲さが後で.*?漏れていることです。.*

最も簡単な修正は、正規表現を別の方法で記述することです。Tcl には固定されていない正規表現 (デフォルト) があり、できるだけ早く一致を開始するため-、文字列の最初から最後までの貪欲な一致は完全です ( .subの後のすべてが割り当てられます-)。これは非常に単純な RE:-(.*)です。これを使用するには、次のようにします。

regexp -- {-(.*)} $a match sub

に注意してください---正規表現はシンボルで始まり、奇妙な (サポートされていない) オプションと混同されるため、ここで必要です。その 1 つのニグルを除けば、それはすべて完全に簡単です。

于 2012-08-10T12:40:04.730 に答える
1
$str = "ODUCTP-1-1-1-2P1";
$str =~ s/^.*?-//;
print $str;

また:

$str =~ /^.*?-(.*)$/;
print $1;
于 2012-08-10T11:58:24.413 に答える