単語内の数字を文字と数字の両方と一致させるには、Perl 正規表現を作成する必要があります。例: test123
. 数字部分だけマッチする正規表現を書いてキャプチャしたい
私はこれ\S*(\d+)\S*
を試していますが、3 のみをキャプチャし、123 はキャプチャしません。
正規表現アトムは可能な限り一致します。
最初は\S*
" " に一致しtest123
ましたが、正規表現エンジンは一致させるためにバックトラックする必要があり\d+
ました。結果は次のとおりです。
+------------------- Matches "test12"
| +-------------- Matches "3"
| | +--------- Matches ""
| | |
--- --- ---
\S* (\d+) \S*
あなたに必要なのは:
my ($num) = "test123" =~ /(\d+)/;
位置 0、次に位置 1 で一致を試みます... 数字が見つかるまで、可能な限り多くの数字と一致します。
数字以外が必要な場合(例ではbeforeなど)、次の貪欲でない式を使用できます。
/\w+?(\d+)/ or /\S+?(\d+)/
(2番目のものは、あなたの仕様により合っています\S*
。)
あなたの式は、1 つ以上の数字で任意の条件を満たします。それがあなたの望むものかもしれません。" 123 "
最後のスペースと最初の数字の間の境界が 0 個以上の非スペースを満たすため、スペース ( ) で囲まれた数字の文字列である可能性があります'3'
。 と次のスペースの間の境界についても同じことが言えます。
おそらく、指定は必要なく、文字列の最初の数字を取得するだけで十分です。しかし、そうでない場合は、予想されるパターンを指定する方法を知っておくとよいでしょう。
あなたの*
正規表現は貪欲です。そのため、数字も「食べる」のです。まさに@Marcが言ったこと、あなたはそれらを必要としません。
perl -e '$_ = "qwe123qwe"; s/(\d+)/$numbers=$1/e; print $numbers . "\n";'
"something122320" =~ /(\d+)/
122320 を返します。これはおそらくあなたがやろうとしていることです;)
\S
数字を含む空白以外の文字と一致します。あなたがしたい\d+
:
my ($number) = 'test123' =~ /(\d+)/;
かっこはキャプチャグループを意味していると思いますが、これはまさにあなたが望まないことです。それらを削除します。あなたが探している/\d+/
または/[0-9]+/