私は文字列を持っています:
set a "ODUCTP-1-1-1-2P1"
regexp {.*?\-(.*)} $a match sub
sub の値は 1-1-1-2P1 になると思います
しかし、私は空の文字列を取得しています。正規表現を適切に使用する方法を教えてもらえますか?
問題は、使用されている RE エンジン (スタックベースではなくオートマトン理論) の特徴である、 の非貪欲さが後で.*?
漏れていることです。.*
最も簡単な修正は、正規表現を別の方法で記述することです。Tcl には固定されていない正規表現 (デフォルト) があり、できるだけ早く一致を開始するため-
、文字列の最初から最後までの貪欲な一致は完全です ( .sub
の後のすべてが割り当てられます-
)。これは非常に単純な RE:-(.*)
です。これを使用するには、次のようにします。
regexp -- {-(.*)} $a match sub
に注意してください--
。-
正規表現はシンボルで始まり、奇妙な (サポートされていない) オプションと混同されるため、ここで必要です。その 1 つのニグルを除けば、それはすべて完全に簡単です。
$str = "ODUCTP-1-1-1-2P1";
$str =~ s/^.*?-//;
print $str;
また:
$str =~ /^.*?-(.*)$/;
print $1;