Если это поможет вам в пути, соответствующий способ убедиться, что следующий набор символов не совпадает с тем, что хранится в обратной ссылке # 1, будет (?!\1)
. Обратите внимание, что группа (?!)
(отрицательный прогноз) является утверждением нулевой ширины (то есть она не изменит положение курсора, она просто проверяет, должно ли регулярное выражение быть неудачным.)
Поддерживает ли это используемый вами механизм регулярных выражений, я не знаю.
Обновление
У меня только что был быстрый набросок на бумаге, и что-то вроде этого могло бы работать в PCRE ... но я не проверял и не могу сейчас, но, возможно, это даст вам некоторые идеи:
(?=(\d{30}))\d(?=\d{29,}?\1)
Чтобы убедиться, что я вас правильно понял, цель приведенного выше регулярного выражения заключается в сопоставлении любой последовательности из 30 цифр, которая также существует позже во всей искомой строке.
Мои мысли о приведенном выше регулярном выражении были такими:
- Сначала я хочу сопоставить последовательность из 30 цифр, но я не хочу использовать их, так как я хочу проверить 1 цифру позже (не 30) в следующий раз. Поэтому я использую прогнозную группу с группой захвата, которая хранит следующие 30 цифр.
- Затем я использую одну цифру, чтобы убедиться, что я не сопоставляю 30 цифр с самими собой.
- Затем я сопоставляю как минимум 29 цифр (что означает, что я начну с цифры, находящейся за пределами текущей последовательности цифр) с не жадным квантификатором, так что он будет пытаться использовать 30, затем 31 и т. Д.
- Тогда я сопоставляю 30 цифр, которые я сейчас тестирую. Если они существуют позже в последовательности, регулярное выражение выполнится успешно; в противном случае произойдет сбой.