2013-02-26 12 views
7

Potrzebuję znaleźć tekst wszystkich jednocyfrowych cyfr.regex: znajdowanie jednocyfrowej liczby

Mój kod:

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

(wynik: 4 i 5)

Wszystko działa doskonale, po prostu chciałem zapytać to jest właściwe, aby używać spacji? Może jest jakiś inny sposób na odróżnienie liczby jednocyfrowej.

Dzięki

+0

Ty brakuje tu kilku specjalnych przypadków. Kiedy liczba jest na początku, na końcu i kiedy jest tylko jedna cyfra w ciągu znaków. – abc667

Odpowiedz

12

Przede wszystkim [\d]{1} jest równoważna \d.

Jeśli chodzi o twoje pytanie, byłoby lepiej użyć asercji o zerowej szerokości, takiej jak lookbehind/lookahead lub granica słowa (\b). W przeciwnym razie nie dopasujesz kolejnych pojedynczych cyfr, ponieważ wiodąca przestrzeń drugiej cyfry zostanie dopasowana jako końcowe miejsce pierwszej cyfry (i nie zostaną znalezione zachodzące na siebie mecze).

Oto jak to piszę to:

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

Oznacza to „dopasować cyfrę tylko wtedy, gdy nie jest nie-biały znak przed nim, a nie jest nie-biały znak po nim” .

Użyłem podwójnego negatywu, takiego jak (?!\S) zamiast (?=\s), aby dopasować również pojedyncze cyfry znajdujące się na początku lub końcu ciągu.

wolę to ponad \b\d\b na swoim przykładzie, bo wygląda na to, że naprawdę chcą tylko, aby dopasować gdy cyfra jest otoczony spacjami i \b\d\b by dopasować 4 i 5 na sznurku jak 192.168.4.5

Aby umożliwić interpunkcyjny na końcu, można użyć następujących:

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

Dodaj żadnych dodatkowych znaków interpunkcyjnych, które chcesz zezwolić po cyfrze do klasy znaków (wewnątrz nawiasów kwadratowych, ale upewnij się, że jest po th e ^).

+0

Niestety ostatni RegEx nie działa w Edge ani Firefox, tylko Chrome – Dan

3

Szukaj wokół granic słowo:

\b\d\b 

Jak wyjaśniono przez innych, to wyodrębnić pojedyncze cyfry oznaczające, że niektóre znaki specjalne mogą nie być przestrzegane jak „” w adresie IP. Aby rozwiązać ten problem, zobacz odpowiedzi F.J i Mike Brant.

10

Użyj word boundaries. Zauważ, że kwantyfikator zakresu {1} (pojedynczy \d dopasuje tylko jedną cyfrę), a klasa znaków [] jest nadmiarowa, ponieważ składa się tylko z jednego znaku.

\b\d\b 
0

To naprawdę zależy od tego, gdzie mogą pojawić się liczby i czy zależy ci na tym, czy sąsiadują z innymi znakami (np. . na końcu zdania).Przynajmniej, użyłbym granic słów, dzięki czemu można uzyskać numery na początku i na końcu łańcucha wejściowego:

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

Ale może warto rozważyć znaków interpunkcyjnych na końcu jak:

$pattern = '/\b\d(\b|\.|\?|\!)/'; 
Powiązane problemy