2015-09-22 2 views
3

Я просматриваю числовые последовательности из 3 значений с разделителями-запятыми и хочу найти любую последовательность из 1,2,3. Я хочу соответствовать 1,2,3; 3,2,1; 2,1,3; и т. д. Я НЕ хочу соответствовать 1,1,1; 1,2,2; 1,3,3; 3,3,1; 2,3,3; используя regexr.com для моего разбора регулярных выражений.regex: последовательности номеров совпадений без соответствия предыдущим совпадениям

[123],[123],[123] 

это то, с чего я начал, пока не понял, что он соответствует любому символу, а не последовательности символов.

Я изучал положительные/отрицательные образы, но не мог думать о том, как структурировать его логически, чтобы регулярное выражение не соответствовало ранее согласованному числу в указанной последовательности.

Какую основную вещь я пропущу здесь?

ответ

5

Вы можете использовать предпросмотр и обратных ссылок на основе регулярных выражений:

([123]),((?!\1)[123]),((?!\1|\2)[123]) 

RegEx Demo

RegEx Распад:

([123])   # match 1 or 2 or 3 and capture it in group #1 
,    # match literal comma 
((?!\1)[123]) # match 1 or 2 or 3 if it is NOT same as group #1 & capture it in group #2 
,    # match literal comma 
((?!\1|\2)[123]) # match 1 or 2 or 3 if it is NOT same as group #1 OR #2 
+1

Ваш второй lookahead должен быть '(?! \ 1 | \ 2)', или вы будете сопоставлять такие вещи, как '1,2,1' или' 3,1,3'. В OP не были такие примеры, но я уверен, что он не хочет их сопоставлять. –

+1

Благодарим вас за подробные объяснения, я начал собирать что-то с помощью модели «([123]), ((?! \ 1)», но мне было сложно понять правильный синтаксис. Спасибо @Alan Moore за исправляя его ответ, вы правы, что я не хочу соответствовать вашим последним примерам. – Brandon

+0

Я пробовал это в функции REGEXMATCH в Google Таблицах, которая, по-видимому, только поддерживает REJLL-регекс. Немного исследовала, и я считаю, что наш текущий движок использует RegExp основан на JavaScript? – Brandon

0

Ответ # 1 является @ решение анубхава, его решение правильно соответствует любой последовательности, если все 3 целых числа уникальны. Однако в ситуации, когда последовательность поиска имеет 2 повторяющихся целых числа, вы используете следующее регулярное выражение, предполагая, что ваша последовательность поиска - 1,2,2. Не могу поверить, что я сделал это трудно: P

((1,2,2)|(2,1,2)|(2,2,1))

я понял, что в ситуации 2 повторяющихся чисел, только 3 возможные совпадения доступны. Итак, вместо того, чтобы пытаться построить сложное регулярное выражение lookbehind/lookahead, мы можем просто искать эти три вхождения буквально. Использование групп захвата должно тегировать то, что соответствует.

Очевидно, что в последовательности из трех повторяющихся целых чисел, таких как 3,3,3, существует только одно возможное совпадение, чтобы вы искали его буквально.

Смежные вопросы