Обратные ссылки в вид сзади - PullRequest
10 голосов
/ 29 апреля 2010

Можете ли вы использовать обратные ссылки в виде сзади?

Допустим, я хочу split везде, где позади меня персонаж повторяется дважды.

    String REGEX1 = "(?<=(.)\\1)"; // DOESN'T WORK!
    String REGEX2 = "(?<=(?=(.)\\1)..)"; // WORKS!

    System.out.println(java.util.Arrays.toString(
        "Bazooka killed the poor aardvark (yummy!)"
        .split(REGEX2)
    )); // prints "[Bazoo, ka kill, ed the poo, r aa, rdvark (yumm, y!)]"

Использование REGEX2 (когда обратная ссылка находится во вложенной вкладке внутри просмотра) работает, но REGEX1 выдает эту ошибку во время выполнения:

Look-behind group does not have an obvious maximum length near index 8
(?<=(.)\1)
        ^

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

Так есть ли способ использовать обратную ссылку в виде сзади?

А если нет, то можете ли вы обойти это, используя этот вложенный взгляд? Существуют ли другие часто используемые методы?

1 Ответ

5 голосов
/ 29 апреля 2010

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

Я был заинтригован, узнав, что Python делает с этим регулярным выражением. Python поддерживает только просмотр заданной длины, а не конечную длину, как в Java, но это регулярное выражение имеет фиксированную длину. Я не мог использовать re.split() напрямую, потому что Python re.split() никогда не разделяется на пустое совпадение, но я думаю, что нашел ошибку в re.sub():

>>> r=re.compile("(?<=(.)\\1)")
>>> a=re.sub(r,"|", "Bazooka killed the poor aardvark (yummy!)")
>>> a
'Bazo|oka kil|led the po|or a|ardvark (yum|my!)'

Вид сзади соответствует между двумя повторяющимися символами!

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