2013-02-26 18 views
7

Tüm tek haneli numaraların metnini bulmam gerekiyor.regex: tek haneli bir rakamı bul

Kodum:

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

(sonuç: 4 ve 5)

Her şey sadece alanlarda kullanmak için doğrudur sormak istedim, mükemmel çalışıyor? Belki bir basamaklı sayıyı ayırt etmenin başka bir yolu olabilir. sözcük sınırları etrafında

Teşekkür

+0

Sen Burada bazı özel durumlar eksik. Sayı başlangıçta, sonunda ve bir dizgede sadece bir rakam olduğunda. – abc667

cevap

12

Öncelikle [\d]{1}\d eşdeğerdir.

Sorunuzda, lookbehind/lookahead veya kelime sınırı gibi sıfır genişlikli bir onaylama kullanılması daha iyi olacaktır (\b). Aksi takdirde, ikinci basamağın öncü alanı, ilk hanenin sonundaki boşluk olarak eşleştirileceğinden ardışık tek haneler ile eşleşmezsiniz (ve çakışan eşlemeler bulunmaz). İşte

ben bunu yazmak görecektir:

Bu "ondan önce bir boşluk olmayan karakter yoktur, ve bir boşluk olmayan karakter ondan sonra yok yalnızca, rakamı maç" anlamına
(?<!\S)\d(?!\S) 

.

(?=\s) yerine (?!\S) gibi çift negatifleri kullandım, böylece dizenin başında veya sonunda bulunan tek haneleri eşleştirebilirsiniz. Eğer gerçekten sadece haneli boşluk içine alındığında eşleştirmek istiyor ve \b\d\b izin vermek için 192.168.4.5

gibi bir dizesinde 4 ve 5 eşleşir benzediği için

Ben senin örneğin \b\d\b üzerinden bu tercih

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

köşeli parantez içindeki karakter sınıfına rakam (sonra izin vermek istediğiniz ek noktalama karakterleri ekleme, ama Mart'tan sonra olduğundan emin olun: sonunda noktalama, aşağıdaki kullanabilirsiniz e ^).

+0

Ne yazık ki son RegEx, Edge veya Firefox'ta çalışmıyor, sadece Chrome – Dan

3

Arama:

başkaları tarafından açıklandığı üzere
\b\d\b 

, bu bazı özel karakterler gibi saygı olmayabilir anlamına tek rakamları elde edecek "" bir ip adresinde Bunu ele almak için bkz. F.J ve Mike Brant'ın cevapları.

10

word boundaries'u kullanın. {1} (tek bir \d tek bir rakamla eşleşecek) aralık niceleyicisinin [] karakter sınıfının yalnızca bir karakterden oluştuğu için gereksiz olduğunu unutmayın. Her şeyden

\b\d\b 
0

Gerçekten sayıların nerede görünebileceğine ve diğer karakterlerle bitişik olup olmadıklarına bakıp bakmadığınıza bağlıdır (bir cümlenin sonunda . gibi).Eğer giriş dizesinin başında ve sonunda rakamları elde böylece En azından ben kelime sınırları kullanır:

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

Ama böyle sonundaki noktalama düşünebilirsiniz:

$pattern = '/\b\d(\b|\.|\?|\!)/';