Общий подход для (эквивалента) «обратных ссылок в классе символов»?

В регулярных выражениях Perl выражения типа\1, \2и т. д. обычно интерпретируются как «обратные ссылки» на ранее захваченные группы, но не так, когда\1, \2и т. д. появляются в классе символов. В последнем случае\ рассматривается как побег (и, следовательно,\1 просто1, и т.д.).

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

/\A       # match beginning of string;
 (.)      # match and capture first character (referred to subsequently by \1);
 [^\1]*   # (WRONG) match zero or more characters different from character in \1;
 \1       # match \1;
 \z       # match the end of the string;
/sx       # s: let . match newline; x: ignore whitespace, allow comments

было быне работать, так как он соответствует (например) строке'a1a2a':

  DB<1> ( 'a1a2a' =~ /\A(.)[^\1]*\1\z/ and print "fail!" ) or print "success!"
fail!

$12и т. д. обычно интерпретируются как «обратные ссылки» на ранее захваченные группы, но не так, когда13$

Есть лиГенеральная (и, надеюсь, простой) обходной путь?

1 Например, для проблемы в примере выше, я бы использовал что-то вроде

/\A
 (.)              # match and capture first character (referred to subsequently
                  # by \1);
 (?!.*\1\.+\z)    # a negative lookahead assertion for "a suffix containing \1";
 .*               # substring not containing \1 (as guaranteed by the preceding
                  # negative lookahead assertion);
 \1\z             # match last character only if it is equal to the first one
/sx

... где я заменил достаточно простое (хотя, увы, неверное) подвыражение[^\1]* в более раннем регулярном выражении с несколько более запрещающим отрицательным утверждением(?!.*\1.+\z), Это утверждение в основном говорит "сдаться, если\1 появляется где-то за этой точкой (кроме последней позиции). "Кстати, я даю это решение только для иллюстрации того обходного пути, о котором я говорил в этом вопросе. Я не утверждаю, что он особенно хорош.

Ответы на вопрос(1)

Ваш ответ на вопрос