0

私のパターン: ^([((01|02|35|27|09|38|12|32|21|28|26|36|08|20|24|04|34|23|31|07|16|11|18|14|03|22|37|25|06|30|13|19|10|05|29|15|17|33)(\d{7}))]{9}|(\d{12}))$

下の図で91は、リストにありません01|02|35|27|09|38|12|32|21|28|26|36|08|20|24|04|34|23|31|07|16|11|18|14|03|22|37|25|06|30|13|19|10|05|29|15|17|33が、それでも返されます。

どうすれば修正できますか?

PHPライブ正規表現

4

5 に答える 5

1

あなたの正規表現全体は次のように言っています:

それで、あなたが間違ったことをしたことはかなり明白なはずです。

代わりに次の正規表現を試してください。

^(?:(?:01|02|35|.....|33)\d{10}|\d{12})$
于 2013-06-06T01:30:32.397 に答える
1

正規表現の最初のセクション全体を文字クラス (角括弧、 と の間のすべて) に配置[]ました。現在は長さのみを照合しているため、文字クラスは必要ありません (すべての数値は char クラスに含まれています)。 )。

したがって、おそらく(テストされていない)のようなものを使用できます。

^((?:01|02|35|27|09|38|12|32|21|28|26|36|08|20|24|04|34|23|31|07|16|11|18|14|03|22|37|25|06|30|13|19|10|05|29|15|17|33)(?:\d{7}))|(\d{12})$

これにより、12 文字のすべての数字 (2 番目のセクション) または指定されたシーケンスで始まる 9 文字のすべての数字が返されます。それがあなたが必要とするものなら...

于 2013-06-06T01:31:40.867 に答える
0

最初の 2 文字をチェックするだけでは、正規表現を使用することはできません。

$valid = ['01', '02', '35', '27', '09', '38', ...];

if (in_array(substr($str, 0, 2), $valid)) {
    // continue validation here
}
于 2013-06-06T01:39:47.810 に答える
0

交互に 01 から 38 までのすべての数字があるため、これを使用できます。

^(?:(?:0[1-9]|[12]\d|3[0-8])\d{7}|\d{12})$
于 2013-06-06T05:45:28.220 に答える