Для произвольной буквенно-цифровой строки:

The quick brown 12345678901234 fox jumped over 987654321, on his second try.

Может ли регулярное выражение извлекать строку смежных чисел длиной ровно девять цифр, если в строке есть другие числа, длина которых превышает девять цифр?

То есть получить 987654321 и игнорировать 12345678901234?

Правило было бы «получить любую строку цифр длиной девять символов, которая либо неограничена, либо, если она ограничена, ограничена любым символом, кроме 0-9».

4
Tim 6 Сен 2016 в 19:35

3 ответа

Лучший ответ

Это соответствует вашей цели только (не нужно портить себя группами):

(?<!\d)\d{9}(?!\d)

См. живую демонстрацию.

При этом используются осмотры, чтобы установить «числовые границы» с любого конца. Осмотритесь вокруг ничего не потребляют, поэтому символы с обеих сторон не являются частью матча - совпадает только ваш целевой номер.

Кроме того, используя отрицательный поиск цифры , а не положительный поиск не цифры, границы также совпадают с началом / концом ввода, поэтому 9-значные числа в самом начале или самом конце ввода по-прежнему совпадают.

3
Bohemian 6 Сен 2016 в 22:14

Использование \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']
0
Jean-François Fabre 6 Сен 2016 в 17:17

Конечно:

\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.

0
Jan 6 Сен 2016 в 16:44