regex: найти однозначное число

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

мой код:

$string = 'text 4 78 text 558 my.name@gmail.com 5 text 78998 text';
$pattern = '/ [d]{1} /';

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

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

спасибо

4 ответов


прежде всего,[\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.,?!])

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


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

\b\d\b

поиск по границам слов:

\b\d\b

Как объяснили другие, это будет извлекать одинарные цифры, означающие, что некоторые специальные символы могут не соблюдаться, как ".- по ip-адресу. Ответ(ы) Ф. Джея и Майка Бранта.


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

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

но вы можете рассмотреть пунктуацию в конце, как:

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