5

正規表現に * を入れると機能しません。+ を入れると機能します。

*は 0 以上を+意味する必要があり、1 以上を意味する必要があります。


*の場合

$num = '    527545855   ';
var_dump( preg_match( '/\d*/', substr( $num, 0, 18 ), $coincidencias ) );
var_dump($coincidencias);exit;

結果:

int(1)
array(1) {
  [0]=>
  string(0) ""
}

+ 付きケース

$num = '    527545855   ';
var_dump( preg_match( '/\d+/', substr( $num, 0, 18 ), $coincidencias ) );
var_dump($coincidencias);exit;

結果:

int(1)
array(1) {
  [0]=>
  string(9) "527545855"
}

どちらもうまくいくはずだと思ったのですが、* がうまくいかない理由がわかりません。

4

5 に答える 5

7

*0回以上の出現を意味するため、最初の出現はテスト文字列の無効文字列です

于 2013-05-30T13:35:38.467 に答える
4

エンジンはインデックス 0 から照合を試みます。

  • 空の文字列に一致する可能性があるため\d*、エンジンはインデックス 0 で空の文字列を返します。
  • 対照的に、\d+少なくとも1つの数字と一致する必要があり、量指定子は貪欲であるため、できるだけ多くの数字を取りながら、最も近い数字のシーケンスを返します(あなたの場合、それは入力文字列の数字のシーケンス全体です) .
于 2013-05-30T13:37:48.983 に答える
4

あなたはあなたの質問でこれに答えました:

* should mean 0 or more, + should mean 1 or more.

最初に一致したのは0以上の数字でした。

于 2013-05-30T13:38:03.403 に答える
3

数字と一致するか、まったく一致しません

\d*0から複数の数字に一致することを意味 します


たとえば

hello 123

正規表現\d*

start( ) で 1 回、 for で 6 回、 forで 1回、合計 8 回一致します。^hello123

于 2013-05-30T13:40:01.937 に答える
2

正規表現の は、その*前の文字を取り、0 個以上のインスタンスを探します。正規表現の+は、1 つ以上のインスタンスを探します。

数値を実際にチェックしていないので (他の項目を気にしている)、正規表現からより多くの項目が返され*ます。これは、数値の前のすべてのスペースに有効な 0 インスタンス句を満たすことができるためです (aスペースは数字の 0 個のインスタンスに一致しています)。+少なくとも1 つが見つかるようにします。

于 2013-05-30T13:41:04.497 に答える