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