Простая проблема, как и та, которую вы опубликовали, делает определение языка нерегулярным ... это означает, что нет регулярного выражения, которое могло бы соответствовать тексту, соответствующему некоторому регулярному подвыражению, и иметь возможность совпадать с той же самой точной строкой, что и вы сопоставленный ранее (это зависимость от контекста и поэтому не может быть проанализирован --- демонстрация доступна во многих местах --- с помощью регулярного выражения / конечного автомата)
Но еще не все потеряно. Многие из библиотек позволяют вам сделать группировку доступной, и, таким образом, вы можете создать группу, а затем сослаться на нее (имеется в виду та же строка, что и ранее) в правой части того же регулярного выражения .
Математически это не обычный язык, и выражение для сопоставления с ним не является также регулярным выражением, но оно работает, как это было реализовано в ранних версиях unix.
HB(...)\1*
Здесь, группа из двух символов карты (любые, кроме новой строки) '.' сопоставляется, и тогда к нему может быть присоединена любая последовательность 0 или более (согласно оператору *
). Это будет соответствовать таким вещам, как
HBABCABCABCABCABCABC
или
HBBBABBABBABBABBA
но не
HBBBABBABBABB (not complete the sequence of three letters BBA)
См. демо
Подвыражение в скобках может быть допустимым регулярным выражением. Как только оно сопоставлено, оно сохраняется для составления остальной части регулярного выражения, заменяя группу \1
на совпавшую. Вы можете достичь еще более сложных вещей, кроме этого, единственное требование - чтобы использовать группу в регулярном выражении, она должна ссылаться на что-то, что ранее было сопоставлено в том же регулярном выражении (это означает, что ссылка на группу должна быть после закрывающая скобка, которая разделяет этот номер группы)