12

次の値があるとします。

123
1234
4567
12
1

「123」に対してのみtrueを返すpreg_matchを修正しようとしているため、3桁の場合にのみ一致します。これは私が持っているものですが、1234 と 4567 にも一致しています。その後にも何かあるかもしれません。

preg_match('/[0-9]{3}/',$number);
4

3 に答える 3

30

必要なのはアンカーです:

preg_match('/^[0-9]{3}$/',$number);

これらは文字列の開始と終了を示します。それらが必要な理由は、通常、正規表現マッチングは件名で一致する部分文字列を見つけようとするためです。

rambo coder が指摘したように$、最後の文字が改行の場合、文字列の最後の文字の前にも一致する可能性があります。この動作を変更するには (456\n一致しないようにするには)、D修飾子を使用します。

preg_match('/^[0-9]{3}$/D',$number);

または、修飾子に関係なく、常に文字列の最後に一致する which を使用\zします (Ωmega に感謝):

preg_match('/^[0-9]{3}\z/',$number);

あなたは「私にも何かあるかもしれない」と言いました。つまり、文字列が正確に 3 桁で始まる必要がありますが、その後に何かがある可能性があります (それが別の数字でない限り) 場合は、否定先読みを使用する必要があります。

preg_match('/^[0-9]{3}(?![0-9])/',$number);

これで、 にも一致123abcします。abc123def否定後読みを使用して、同じことを正規表現の先頭に適用できます (一致する必要がある場合)。

preg_match('/(?<![0-9])[0-9]{3}(?![0-9])/',$number);

ルックアラウンド アサーションに関する詳細情報。

于 2012-11-25T21:54:19.467 に答える
4

正規表現を固定する必要があります

/^\d{3}$/
于 2012-11-25T21:54:28.663 に答える
4

テキスト内の任意の場所で 3 桁の数字を検索する場合は、正規表現パターンを使用します

/(?<!\d)\d{3}(?!\d)/

ただし、入力が3桁の数字だけであることを確認した場合は、次のようにします

/\A\d{3}\z/
于 2012-11-25T23:42:05.737 に答える