0

文字列が単一の整数またはテキストや整数の組み合わせで構成されていると仮定して、文字列の最後の整数を照合し、最後の整数の前後の可能な要素をキャプチャする必要があります。$strは次のようになります。

  • '123'->'' --123-''
  • 'abc 123'->'abc' --123
  • 'abc 123 def'->'abc' --123-'def'
  • 'abc 123 def 456'->'abc 123 def'-456

私は、phpの次のコードがその仕事をすることを期待していました。

$str = 'abc 123 def 456 ghi';
preg_match('/(.*)(\d+)(\D*)$/', $str, $matches);
echo 'Matches = ' . implode(' : ', $matches);

しかし、(\ d +)は1桁しか拾っていません:

 Matches = abc 123 def 456 ghi : abc 123 def 45 : 6 :  ghi

私が期待していた間:

 Matches = abc 123 def 456 ghi : abc 123 def  : 456 :  ghi

Javascriptでも同じ動作がします。(。*)は、(\ d +)に衝突するのに貪欲ですか?

前もって感謝します!

4

5 に答える 5

6

なぜ/(\d+)\D*$/ですか?そうすれば、唯一のキャプチャ グループは整数です。

ところで、正規表現を扱っているときは、通常http://gskinner.com/RegExr/を使用します

于 2012-05-11T21:50:05.793 に答える
2

Javascriptの場合:

$str = 'abc 123 def 456';
$matches = $str.match(/\d+/g);
$lastInt = $matches[$matches.length-1];

PHPの場合

$str = 'abc 123 def 456';
preg_match_all('/(\d+)/', $str, $matches);
$lastInt = end($matches);
echo 'Last integer = ' . $lastInt;
于 2012-05-11T21:49:38.363 に答える
1

パターンの最後にある「\D*$」は、それが最後の数字であることを確認するため、.* を完全に避けることができます。

また、不要な括弧を追加せず、本当に必要なものだけを取得することをお勧めします。つまり、次のようにして最後の番号のみを取得できます。

preg_match('/(\d+)\D*$/', $str, $matches);

ただし、文字列の他の部分で一致する必要があり、探している数字がそれ自体の単語である場合は、その正規表現に (\d+) の前に \b パラメータを追加して、(.* )は、あなたの番号の一部を貪欲に消費しません。すなわち:

preg_match('/(.*)\b(\d+)(\D*)$/', $str, $matches);
于 2012-05-11T21:56:53.627 に答える
0

これでうまくいくはずです...

(\d+)(?!.*\d) 
于 2012-05-11T21:49:56.970 に答える
0

最後の整数をキャッシュしたい場合は、正規表現の最後に $ を使用する必要があります。

/(\d+)$/両方の言語で試してみてください。

于 2012-05-11T21:50:57.053 に答える