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|\.|\?|\!)/';