0

私はPHPでかなり単純な抽出をしようとしています:

$empAward = 'AMW10';
if (preg_match("/\w+(\d+)/",$empAward,$matches)) {
    $level = $matches[1]; // Wanted '10', but getting '0'
}
echo "Level is " . $level . "\n";

正規表現が最後の 2 桁をキャプチャすることを望んでいましたが、最後の桁、この場合は 0 のみを取得しているように見えます。10 を取得したかったのです。\d+ の指定は、すべての数字を取得するまで続行すると思いましたが、最後の文字だけを取得するだけです。これは「貪欲」であることと関係があるのでしょうか、それともその反対のこと (「寛大」?!) と関係があるのでしょうか?!

みんなありがとうピート

4

6 に答える 6

1

\w一致[a-zA-Z0-9_]と \d が一致するため、正規表現は一致し[0-9]ません(ユニコードモードではない場合)。基本的にここで起こっていることは、\w数字にも一致するため、エンジンがトークンを認識し、これも貪欲で、すべて (文字列全体) に一致することです。次に、 に気付き、\d+1 つのステップをバックトラックしてパターンを再試行する必要があります。\wが一致AMW1\d+、正常に一致し0ます。エンジンにとっては、式を満たすので、これはまったく問題ありません。しかし、明らかにそれはあなたのためにトリックをしません.

代わりにすべきことは、パターンをもう少しよく定義することです。いくつかの選択肢があります:

  1. 一致させたい数字の前に数字がないことを確認するか、/[a-z](\d+)/iまたは/\D(\d+)/(多くの派生語があります...)
  2. または、受け取りたい固定値の場合は、エンジンが取得する桁の長さを指定して、正しい結果が得られるようにすることができます: /\w+(\d{2})/(繰り返しになりますが、多くの導関数...)

いずれにせよ、これをすべて述べれば、あなたはそれを理解できると確信しています:)

于 2013-07-20T11:04:26.297 に答える
1

ああ、私はそれを理解したと思います。

機能する正規表現は次のとおりです。

/[A-Za-z](\d+)/

私が理解しているように、正規表現は、数値の正規表現まで、\w+アルファ(\d+)数字に一致し、最後の正規表現はキャプチャする文字が1つだけ残っています。の正しい解釈\w+ですか?

この回答にすぐに戻ってきて申し訳ありません。もっと実験する必要がありました。

于 2013-07-20T10:46:41.647 に答える
0

これを使って

preg_match("/\w(\d+)+$/",$empAward,$matches);
于 2013-07-20T10:48:59.103 に答える