web-dev-qa-db-ja.com

PHP preg_matchで正確に3桁を一致させる方法は?

次の値があるとします。

123
1234
4567
12
1

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

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

必要なのは アンカー

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

それらは文字列の開始と終了を示します。それらが必要な理由は、一般的に正規表現マッチングは、サブジェクト内の一致する部分文字列を見つけようとするためです。

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

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

または、\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);

lookaroundアサーションについてさらに読む。

25
Martin Ender

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

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

ただし、入力が3桁の数値であり、それ以外の何もないことを確認した場合は、

/\A\d{3}\z/
4
Ωmega

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

/^\d{3}$/
4
Andy Lester