正規表現で最も一致しないグループ番号を取得するにはどうすればよいですか?
正規表現があるとします
/(a(b))|(b(1))|(c(4))/...
例: 入力文字列は "b1" で、一致するグループ番号 2 の最小値です。 ($2)
例: 入力文字列は "c4" で、一致するグループ番号 5 の最小値です。 ($5)
例: 入力文字列は "ab" で、一致するグループ番号 1 の最小値です。 ($1)
解決策は 1 つありますが、あまり効率的ではありません。試してくれてありがとう。本当の問題は効率です。多くの人が、私が見つけた同様のソリューションを提供しています。問題は、最も低いグループを検索する線形時間です。O(N) n はキャプチャ グループの数です。もっと速い方法はないかと考えました。O(1) それがこの質問の目的でした。Perl には、その値を取得するための隠し機能があると予想していました。ないと思います。
その間、私は自分で解決策を見つけました。ここにあります..
/(a(b)(??{ $first=1;"" }))|(b(1)(??{ $first=2;"" }))|(c(4)(??{ $first=5;"" }))/
$first を見つける時間は O(1) です。
if (@matches = $conv::content =~/$conv::trtree{convertsourceregqr}[$conversionno]/)
{
my $firstno;
my $c = 0;
for my $m (@matches)
{
if (defined $m)
{
$firstno=$c;
last;
}
$c++;
}**strong text****strong text**