2013-02-26 16 views
7

すべての桁の数字のテキストを見つける必要があります。regex:1桁の数字を見つける

私のコード

$string = 'text 4 78 text 558 [email protected] 5 text 78998 text'; 
$pattern = '/ [\d]{1} /'; 

(結果:4と5)

すべてが完璧に動作は、ちょうどそれをお聞きしたかったスペースを使用するには、正しいでしょうか? おそらく1桁の数字を区別する別の方法があります。単語の境界の周り

おかげ

+0

特別なケースがいくつかありません。数字が先頭にあるとき、最後に文字列の1桁だけのとき。 – abc667

答えて

12

まず、[\d]{1}\dと同等です。

あなたの質問には、lookbehind/lookaheadや単語境界(\b)のようなゼロ幅アサーションを使用する方がよいでしょう。それ以外の場合は、2桁目の先頭スペースが最初の数字の末尾スペースと一致し、重複する一致が見つからないため、連続する1桁の数字と一致しません。ここで

は、私がこれを書いだろうかです:

(?<!\S)\d(?!\S) 

これは、「非空白文字がその前に存在しない場合にのみ、数字と一致し、かつ非空白文字が後にありません」という意味します。

(?=\s)の代わりに(?!\S)のようなダブルネガティブを使用したので、文字列の先頭または末尾の1桁の数字も一致します。それはあなたが本当に唯一の数字はスペースに囲まれたときに一致させたい、と\b\d\bができるようにする192.168.4.5

のような文字列で45にマッチするようになりますので

私はあなたの例のために\b\d\bの上にこれを好みます

(?<!\S)\d(?![^\s.,?!]) 

あなたは角括弧の内側に文字クラスへの桁(後にできるようにしたい任意の追加の句読点文字を追加しますが、それは目の後にあることを確認してください。最後の句読点は、次のような使用することができますe ^)。

+0

残念ながら、最後のRegExはEdgeまたはFirefoxでは動作しません。 – Dan

3

検索:

\b\d\b 

他の人が説明したように、これは一部の特殊文字は次のように尊敬されない可能性があることを意味し、単一の数字を抽出します「を。」 IPアドレスでそれに対処するには、F.JとMike Brantの答えを参照してください。

10

使用word boundaries。それが唯一の文字で構成されているので範囲数量詞{1}(単一\dは一桁と一致します)および文字クラス[]が冗長であることに留意されたいです。

\b\d\b 
0

それは本当に数字が表示される可能性のある場所に依存しており、彼らは他の文字(文の終わりのような.)に隣接している場合あなたが気にするかどうか。非常に少なくとも、あなたが入力文字列の先頭と末尾に数字を得ることができるように、私は単語の境界を使用します。

$pattern = '/\b\d\b/'; 

しかし、あなたは次のように末尾に句読点を検討するかもしれない:あなたは

$pattern = '/\b\d(\b|\.|\?|\!)/'; 
関連する問題