RegEx для исключения повторяющихся одиночных символов - PullRequest
4 голосов
/ 16 мая 2019

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

(.)\1{3,} будет соответствовать одному повторяющемуся символу, например, соответствуетaaaa, но не ababab или abcde

(.+)\1{3,} будет соответствовать повторному патерну, например aaa, ababab, ab ab ab, но не abcde

Iхотите сопоставить только ababab, ab ab ab и т. д., но не aaaa или abcde

Как мне решить эту проблему?

Ответы [ 3 ]

3 голосов
/ 16 мая 2019

Поскольку вы хотите отменить совпадение, если все символы одинаковы, вы можете использовать отрицательный взгляд, чтобы отклонить это. В противном случае вы можете изменить + на {2,} в квантификаторе, где вы захватываете первую часть, а затем использовать {2,}, чтобы ваша первая подходящая часть повторялась три или более раз. Вы можете использовать это регулярное выражение,

^(?!(.)\1+$)(.{2,})\2{2,}$

Пояснение:

  • ^ - начало строки
  • (?!(.)\1+$) - этот негативный взгляд вперед гарантирует, что если строка состоит только из одного символа до конца строки, то отклоняет совпадение.
  • (.{2,}) - сопоставьте два или более любых символа и захватите их в группу2
  • \2{2,} - Повторите то, что было захвачено в группе2 два или более раз
  • $ - конец строки

Regex Demo 1

Кроме того, из вашего поста, как вы сказали, вы не хотите совпадать с aaaa, так как шаблон aa повторяется только два раза, а не три или более раз, так что если я прав, и вы считаете aaaaaa как успешное совпадение, потому что теперь он имеет aa повторение три раза, в этом случае вы можете избавиться от негативного взгляда из моего вышеприведенного регулярного выражения и использовать это регулярное выражение, которое не будет соответствовать aaaa, но будет соответствовать aaaaaa, как я объяснено выше.

^(.{2,})\1{2,}$

Regex Demo 2

Дайте мне знать, действительно ли это то, что вы хотели. В случае каких-либо запросов, не стесняйтесь оставлять свой комментарий.

2 голосов
/ 16 мая 2019

Вы можете использовать это регулярное выражение:

^((.)\2*?(?!\2).+?)\1{2,}$

Первая часть ((.)\2*?(?!\2).+?) соответствует строке, в которой есть как минимум 2 разных символа, затем повторяется как минимум еще 2 раза \1{2,}.

Разбивая первую часть, мы сначала сопоставляем первый символ, помещаем его в группу 2. Затем мы разрешаем этому персонажу повторяться несколько раз или нет (\2*). Затем мы утверждаем, что должно быть что-то еще, кроме этого символа (?!\2). И тогда мы лениво сопоставим с остальными .+?.

Демо

0 голосов
/ 16 мая 2019

Может быть, вы могли бы проверить длину того, что вы подходите:

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

Демо

Регулексный график

enter image description here

...