2013-02-26 3 views
7

Мне нужно найти текст всего однозначного числа.regex: найти одноразрядное число

Мой код:

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

(результат: 4 и 5)

Все работает отлично, просто хотел спросить, правильно использовать пробелы? Возможно, есть и другой способ отличить одноразрядное число.

Благодаря

+0

Вы здесь приводятся некоторые особые случаи. Когда номер находится в начале, в конце и когда это только одна цифра в строке. – abc667

ответ

12

Прежде всего, [\d]{1} эквивалентно \d.

Что касается вашего вопроса, было бы лучше использовать утверждение нулевой ширины, например, lookbehind/lookahead или границу слова (\b). В противном случае вы не будете сопоставлять последовательные одиночные цифры, потому что ведущее пространство второй цифры будет сопоставляться как конечное пространство первой цифры (и совпадающие совпадения не будут найдены).

Вот как я это пишу:

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

Это означает, что «соответствует цифре, только если не непробельный символа перед ним, и не непробельным символом после него» ,

Я использовал двойной отрицательный как (?!\S) вместо (?=\s) так, чтобы вы также соответствовали отдельным цифрам, которые находятся в начале или конце строки.

Я предпочитаю это более \b\d\b для примера, потому что это выглядит, как вы действительно только хотите, чтобы соответствовать, когда цифра окружен пробелами и \b\d\b будет соответствовать 4 и 5 в строке как 192.168.4.5

Чтобы разрешить знаки препинания в конце концов, вы можете использовать следующее:

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

Добавьте любые дополнительные знаки препинания, которые вы хотите, чтобы после того, как цифры в классе символов (внутри квадратных скобок, но убедитесь, что после того, как го e ^).

+0

К сожалению, последний RegEx не работает в Edge или Firefox, только Chrome – Dan

3

Поиск вокруг границ слова:

\b\d\b 

Как объяснить другим, это будет извлекать отдельные цифры, означающие, что некоторые специальные символы могут не соблюдаться, как «» в IP-адресе. Чтобы рассмотреть это, см. Ответы F.J и Майка Бранта.

10

Использование word boundaries. Обратите внимание, что квантификатор диапазона {1} (один \d будет соответствовать только одной цифре), а класс символов [] является избыточным, поскольку он состоит только из одного символа.

\b\d\b 
0

Это действительно зависит от того, где могут появляться цифры и не заботятся ли вы, если они находятся рядом с другими персонажами (например, . в конце предложения).По крайней мере, я хотел бы использовать границы слов, так что вы можете получить номера в начале и в конце строки ввода:

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

Но вы могли бы рассмотреть знаки препинания в конце, как:

$pattern = '/\b\d(\b|\.|\?|\!)/'; 
Смежные вопросы