2015-11-25 2 views
0

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

бы там быть регулярное выражение, которое описывает это, , например, я попытался (123) | (231) | (312) * , но это не будет работать, как я должен учитывать 12, находящейся в строке и 23

+0

Вы хотите совместить все подстроки этой бесконечной строки? – Ra1nWarden

+2

Должно быть больше условий, иначе его просто '(? = (\ D {3}))' – sln

+0

'(123) +' - http://regexr.com/3c9i3 – RPGillespie

ответ

1

Определите бесконечную строку как конкатенацию бесконечного числа копий одной и той же базовой строки <base> ()в вашем примере). Начните с наблюдением, что любая подстрока имеет следующие части, возникающие в указанном порядке:

  1. суффикс <base> или пустая строка
  2. 0 или более повторений <base>
  3. префикс <base> или пустое строка

В регулярных выражениях жаргона, который переводит в

  1. Необязательное чередование всех <base> суффиксы
  2. Оператор Клини применяется к <base>
  3. Необязательное чередование всех <base> префиксов

В частности:

(23|3)?(123)*(1|12)? 

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

123|((23|3)(123)*(1|12)?)|((23|3)?(123)*(1|12)) 
-1

Я думаю, this is the closest you're going to get with проверять «узоры». В противном случае, если вам нужна большая изменчивость, вам понадобится (по крайней мере) помощь обработки среднего уровня с вашим выбором языка программирования.

^(?<detectPattern> 
    123 
    |132 
    |213 
    |231 
    |312 
    |321 
)\k<detectPattern>*$ 

Образец написан с использованием ссылки в конце, чтобы визуально объяснить, как оно сочетается в начале. В противном случае вы можете так же легко удалить \k<detectPattern>, но сохранить *.

+0

Ваш шаблон кажется ошибочным. Во-первых, он не будет соответствовать бесконечным строкам из-за якорей. Во-вторых, отбрасывая якоря, он будет идентифицировать только строки длины '3 * n; n = 1, 2, ... '. Хуже того, он не соответствует суб * строкам *, но суб * последовательности * (например, '132' нигде не встречается в примерной строке OP в качестве подстроки). Наконец, он не идентифицирует * все * подпоследовательности (но тогда, если бы это было требование OP, решение было бы просто '[123] +'). – collapsar

+0

@collaspar Его пример был на одной линии. Добавление «132» было всего лишь еще одной комбинацией чисел, которые были даны, чтобы проиллюстрировать способ достижения конечного результата. – Erutan409

+0

@collaspar Кроме того, бесконечным должен быть относительный термин, рассматриваемый для того, как будет применяться регулярное выражение. Для регулярного выражения должна быть какая-то форма конечного конца, чтобы когда-либо быть успешным для проверки указанного шаблона. В противном случае все, что вы бросаете на него, в конечном итоге потерпит неудачу из-за слишком большого количества обработки/циклов. «Я думаю» не утверждал, что мое решение было 100%. Это было то, что я считал самым близким (практическим) подходом к достижению некоторой формы обнаружения в начале и проверке остальной части строки. – Erutan409

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