Люди, Я пытаюсь использовать регулярные выражения для обработки большого набора строк чисел и сопоставления последовательностей цифр для определенных шаблонов, где некоторые цифры повторяется в группах. Часть требования заключается в обеспечении уникальности между разделами данного шаблона.regex, сопоставляющий две группы повторяющихся цифр, где обе не могут быть одинаковыми цифрами
Примером подобного сращивания я пытаюсь достичь
ABBBCCDD
Интерпретировать это как набор цифр. Но A, B, C, D не могут быть одинаковыми. И повторение каждого - это образец, который мы пытаемся сопоставить.
Я использую регулярные выражения с отрицательным внешним видом, как часть этого соответствия, и он работает, но не все время, и я смущен относительно того, почему. Я надеюсь, кто-то может объяснить, почему его сбой и предложить решение.
Так обратиться ABBBCCDD я придумал это RE с помощью отрицательных смотреть вперед, используя группу ..
(.)(?!\1{1,7})(.)\2{2}(?!\2{1,4})(.)\3{1}(?!\3{1,2})(.)\4{1}
Чтобы разорвать этот вниз ..
(.) single character wildcard group 1 (A)
(?!\1{1,7}) negative look-ahead for 1-7 occurrences of group 1 (A)
(.) single character wildcard group 2 (B)
\2{2} A further two occurrences of group 2 (B)
(?!\2{1,4}) Negative look-ahead of 1-4 occurrences of group 2 (B)
(.) single character wildcard group 3 (C)
\3{1} One more occurrence of group 3 (C)
(?!\3{1,2}) Negative look-ahead of 1-2 occurrences of group 3 (C)
(.) single character wildcard group 4 (D)
\4{1} one more occurrence of group 4 (D)
мыслящие здесь является то, что негативным взгляды на будущее действуют как средство проверки того, что данный символ не найден там, где это неожиданно. Таким образом, A проверяется в следующих 7 символах. После того, как B и 2 повторения совпадают, мы отрицательно смотрим вперед на B в следующих четырех символах. Наконец, как только пара Cs сопоставлена, мы смотрим в финале 2 для C как средство обнаружения несоответствия.
Для данных теста эта строка «01110033» соответствует выражению. Но это не должно потому, что «0» для А повторяется в позиции «С».
Я проверил проверки этого выражения на Python и grep в режиме PCRE (-P). Оба соответствуют неправильному шаблону.
Я положил выражение в https://regex101.com/ вместе с той же тестовой строкой «01110033», и оно также соответствовало этому. У меня недостаточно рейтинга для публикации изображений этого или вариантов, которые я пробовал с тестовыми данными. Так вот некоторые текстовые грейферы из командной строки выполняются с Grep -P
Таким образом, наше недействительно выражение, которое повторяет в CC позиция получает через ..
$ echo "01110033" | grep -P '(.)(?!\1{1,7})(.)\2{2}(?!\2{1,4})(.)\3{1}(?!\3{1,2})(.)\4{1}'
01110033
$
Изменения DD 11, копирование ГЭБА, мы также считают, что получает через несмотря на B, имеющий передний отрицательный чек ..
$ echo "01110011" | grep -P '(.)(?!\1{1,7})(.)\2{2}(?!\2{1,4})(.)\3{1}(?!\3{1,2})(.)\4{1}'
01110011
$
Теперь измените DD до «00», копируя CC цифр и низкий, и вот он не соответствует ..
$ echo "01110000" | grep -P '(.)(?!\1{1,7})(.)\2{2}(?!\2{1,4})(.)\3{1}(?!\3{1,2})(.)\4{1}'
$
Удалите передний-отрицательный чек для CC "(?! \ 3 {1,2})" из выражения, и наш повтор цифры C в позиции D прорвется.
$ echo "01110000" | grep -P '(.)(?!\1{1,7})(.)\2{2}(?!\2{1,4})(.)\3{1}(.)\4{1}'
01110000
$
Назад к оригинальному номеру испытания и переключатель CC цифр в то же использование «1» из B. Она не достучаться.
$ echo "01111133" | grep -P '(.)(?!\1{1,7})(.)\2{2}(?!\2{1,4})(.)\3{1}(?!\3{1,2})(.)\4{1}'
$
И играть это для группы В, установите B цифру к тому же 0, как встречается для А. также не соответствуют ..
$ echo "00002233" | grep -P '(.)(?!\1{1,7})(.)\2{2}(?!\2{1,4})(.)\3{1}(?!\3{1,2})(.)\4{1}'
$
Затем выньте отрицательный предпросмотр для а и мы можем это, чтобы соответствовать ..
$ echo "00002233" | grep -P '(.)(.)\2{2}(?!\2{1,4})(.)\3{1}(?!\3{1,2})(.)\4{1}'
00002233
$
Так что, мне кажется, что прямая отрицательная проверка работает, но что он работает только со следующим смежным набором или его предполагаемый диапазон опережения обрывается в некоторых для предположительно, дополнительными вещами, которые мы пытаемся сопоставить.
Если добавить дополнительный предпросмотр на праве после B и его повторение были обработаны, мы получаем его, чтобы избежать согласований на CC части повторного использования А цифра ..
$ echo "01110033" | grep -P '(.)(?!\1{1,7})(.)\2{2}(?!\1{1,4})(?!\2{1,4})(.)\3{1}(?!\3{1,2})(.)\4{1}'
$
Для того, чтобы это дальше, то после согласования набора CC мне нужно будет снова повторить негативные образы для A и B. Это просто кажется неправильным.
Надеюсь, эксперт RE может прояснить то, что я делаю неправильно здесь или подтвердить, если отрицательна-предпросмотр действительно ограничивается на основании того, что я наблюдая
Спасибо за это. Это будет специально работать для примера, который я показал. Некоторые из более сложных шаблонов, однако, будут повторять A, B, C, D позже в последовательности. Но на основании вашего ответа я просто обнаружил, что использование .. (?!. {0,6} \ 1) также будет работать как средство тестирования моей группы в следующих 7 символах путем подачи его в виде 0-6 подстановочных знаков по моему групповому характеру. Поэтому я сейчас буду работать с этим подходом. Еще раз спасибо за быстрый ответ. –