Для произвольной буквенно-цифровой строки:
The quick brown 12345678901234 fox jumped over 987654321, on his second try.
Может ли регулярное выражение извлекать строку смежных чисел длиной ровно девять цифр, если в строке есть другие числа, длина которых превышает девять цифр?
То есть получить 987654321
и игнорировать 12345678901234
?
Правило было бы «получить любую строку цифр длиной девять символов, которая либо неограничена, либо, если она ограничена, ограничена любым символом, кроме 0-9».
3 ответа
Это соответствует вашей цели только (не нужно портить себя группами):
(?<!\d)\d{9}(?!\d)
См. живую демонстрацию.
При этом используются осмотры, чтобы установить «числовые границы» с любого конца. Осмотритесь вокруг ничего не потребляют, поэтому символы с обеих сторон не являются частью матча - совпадает только ваш целевой номер.
Кроме того, используя отрицательный поиск цифры , а не положительный поиск не цифры, границы также совпадают с началом / концом ввода, поэтому 9-значные числа в самом начале или самом конце ввода по-прежнему совпадают.
Использование \b
для привязки строки не работает для The quick brown 12345678901234 fox jumped over xx987654321xx, on his second try
(ограниченного нецифрами), что:
(?:^|[^\d])(\d{9})(?:$|[^\d])
(группы без захвата для начала / конца или без цифр)
Демонстрация здесь
Изменить: более простой более "современный" стиль:
(?:^|\D)(\d{9})(?:$|\D)
Тест Python (который захватывает несколько 9-значных групп):
import re
p=re.compile(r"(?:^|\D)(\d{9})(?:$|\D)")
print(re.findall(p,"The quick brown 12345678901234 fox jumped over 987654321dd, 123456789"))
Дает:
['987654321', '123456789']
Конечно:
\b\d{9}\b
# a word boundary (ie space, punctuation, comma)
# exactly nine consecutive digits
# another boundary
См. демонстрацию на regex101.com .
\D(\d{9})\D
# not a digit
# nine consecutive digits
# not a digit
С этим вам нужно будет использовать {{X0} } еще раз. Однако это зависит от того, где находятся цифры. Последнее не будет работать в самом начале или начале строки (для этого требуется ровно по одному символу с каждой стороны). Лучше всего использовать отдельные цифры \b
.
Похожие вопросы
Новые вопросы
regex
Регулярные выражения предоставляют декларативный язык для сопоставления шаблонов в строках. Они обычно используются для проверки строк, разбора и преобразования. Укажите язык (PHP, Python и т. д.) или инструмент (grep, VS Code, Google Analytics и т. д.), который вы используете. Не размещайте вопросы, требующие объяснения того, что означает символ или чему будет соответствовать конкретное регулярное выражение.