2017-01-09 9 views
3

Я хотел бы создать q регулярное выражение, которое соответствует шаблонам повторяющихся одиночных символов, за которыми следуют друг друга. Например, три раза тот же символ «A», за которым следует два раза другой символ «B». Неважно, повторяется ли второй символ более двух раз. Например, он должен соответствовать строке wuzDDDFFFxjiКак исключить один символ одной группы из второй группы?

Full match 3-8 `DDDFF` 
Group 1. 3-4 `D` 
Group 2. 6-7 `F` 

я пришел с следующим регулярным выражением, но есть одно ограничения.

(.)\1{2}(.)\2{1} 

Это почти работает, но это не исключает характер первой группы из подкрепляются во второй группе. Струнные qwuiuQQQQQsas будет сравниваться с:

Full match 5-10 `QQQQQ` 
Group 1. 5-6 `Q` 
Group 2. 8-9 `Q` 

Это не соответствует тому, что я хочу, но я не мог найти правильный синтаксис, чтобы исключить конкретную группу из подкрепляются в другой. Моя самая близкая попытка, похоже, не работает

(.)\1{2}((?:\1))\2{1} 


1st Capturing Group (.) 
. matches any character (except for line terminators) 
\1{2} matches the same text as most recently matched by the 1st capturing group 
{2} Quantifier — Matches exactly 2 times 
2nd Capturing Group ((?:\1)) 
Non-capturing group (?:\1) 
\1 matches the same text as most recently matched by the 1st capturing group 
\2{1} matches the same text as most recently matched by the 2nd capturing group 
{1} Quantifier — Matches exactly one time (meaningless quantifier) 

Любой намек здесь? Спасибо огромное!

+0

Что такое регулярное выражение вкуса/язык программирования/инструмент? Почему не работает последний шаблон? –

+0

Попробуйте ['(.) \ 1 {2} ((?! \ 1).) \ 2'] (https://regex101.com/r/rjRNik/1), если вы хотите избежать соответствия чему-либо в' qwuiuQQQQsas ' –

ответ

3

Чтобы избежать согласования qwuiuQQQQQsas вам необходимо использовать отрицательный предпросмотр, а не не-захвата группы:

(.)\1{2}((?!\1).)\2 
     ^^^^^^ 

См the regex demo.

(?!\1) отрицательного предпросмотр будет «ограничивать» в . шаблон для других, чем только спичечных совпавших символов в группу 1.

Non-захват группа не ограничивает какую-либо модели, но используются для всего группы подшаблонов, что до сих пор потреблять текст, а lookaheads (утверждения с нулевой шириной) не потребляют текст и только проверяют, присутствует ли текст, встречающийся в шаблоне, в строке или нет.

+0

Кажется работать! Я не так далеко. Кстати, меня что-то пугает. Btw, учитывая, что я хочу, чтобы n раз один и тот же символ, почему мне нужно писать {n-1} после ссылки на группу? кажется, захват уже рассчитывает на раз сам. – tbop

+1

Вы сопоставляете символ с '.', который находится внутри скобок скобок'() '. Итак, добавив '\ 1 {2}' после того, как он захватит еще 2 одинаковых символа, всего 3. Группы потребляют текст, только просмотры (lookbehind, lookaheads) и другие утверждения нулевой ширины (границы слов, привязки) не потребляют текст. –