Использование регулярных выражений для поиска последовательных блоков произвольной длины - PullRequest
4 голосов
/ 28 декабря 2011

У меня есть строка, содержащая единицы и нули. Я хочу определить, есть ли подстроки из 1 или более символов, которые повторяются по крайней мере 3 раза подряд. Например, строка «000» имеет подстроку длиной 1, состоящую из одного нулевого символа, который повторяется 3 раза. Строка '010010010011' на самом деле имеет 3 таких подстроки, каждая из которых повторяется 3 раза ('010', '001' и '100').

Существует ли выражение регулярного выражения, которое может найти эти повторяющиеся шаблоны, не зная ни конкретного шаблона, ни длины шаблона? Мне все равно, что это за образец и какова его длина, только то, что строка содержит 3-торфный узор.

Ответы [ 3 ]

3 голосов
/ 28 декабря 2011

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

     /(.+).*?\1.*?\1/

Преодолев это:

   (.+)          matches any 1 or more characters, starting anywhere in the string
   .*?           allows any length of interposing other characters (0 or more)
   \1            matches whatever was captured by the (...+) parentheses
   .*?           0 or more of anything
   \1            the original pattern, again

Если вы хотите, чтобы повторы происходили в непосредственной близости, вместо этого используйте

     /(.+)\1\1/

… как предложено @Buh Buh - нотация \1 против $1 может варьироваться в зависимости от вашей системы регулярных выражений.

2 голосов
/ 28 декабря 2011
(.+)\1\1

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

\1 означает повторение 1-го матча.

0 голосов
/ 28 декабря 2011

выглядит странно, но это может быть решением:

/000000000|100100100|010010010|001001001|110110110|011011011|101101101|111111111/

Содержит все возможные комбинации три раза.Таким образом, ваше регулярное выражение будет соответствовать для этих чисел (то есть):

  1. 10010010011
  2. 00010010011
  3. 10110110110

Но не для этих:

  1. 101010101010
  2. 001110111110
  3. 111000111000

И не имеет значения, где последовательность появляется во всей строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...