Почему выражение в этом регулярном выражении не имеет «очевидной максимальной длины»? - PullRequest
1 голос
/ 06 октября 2011

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

] [abc] [123] abc]

Я хочу найти только вторую закрывающую скобку.

следующее регулярное выражение

(? <= [А-г] +) \] </p>

найдет мне вторую закрывающую скобку, но также и последнюю:

] [abc ] [123] abc ]

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

(? <= <b>\ [ [A-Z] +) \]

... и я получаю: «Группа наблюдения не имеет очевидной максимальной длины около индекса 11».

\[ - это всего лишь один символ, поэтому кажется, что очевидная максимальная длина должна быть 1 + независимо от того, какая очевидная максимальная длина была для группы поиска в первом выражении. Что дает?


ETA: Не относится к открывающей скобке.

(? <= А [Ь-г] +) \] </p>

выдает мне ту же ошибку. (Ну с индексом 12.)

Ответы [ 2 ]

3 голосов
/ 06 октября 2011

\ [- это всего лишь один символ, поэтому кажется, что очевидная максимальная длина должна быть 1 + независимо от того, какая очевидная максимальная длина была для группы поиска в первом выражении. Что дает?

В этом суть, "независимо от того, какая очевидная максимальная длина была для группы поиска в первом выражении" , не очевидно. Правило кулака заключается в том, что вы не можете использовать + или * внутри оглядки. Это относится не только к движку Java regex, но и ко многим другим движкам с PCRE (даже движком Perl (v5.10)!).

Однако вы можете сделать это с прогнозом:

Pattern p = Pattern.compile("(?=(\\[[a-z]+]))");
Matcher m = p.matcher("] [abc] [123] abc]");
while(m.find()) {
  System.out.println("Found a ']' before index: " + m.end(1));
}

(т.е. группа захвата в перспективе (!), Которая может быть использована для получения end(...) группы)

напечатает:

Found a ']' before index: 7

EDIT

И если вы заинтересованы в замене таких ], вы можете сделать что-то вроде этого:

String s = "] [abc] [123] abc] [foo] bar]";
System.out.println(s);
System.out.println(s.replaceAll("(\\[[a-z]+)]", "$1_"));

который напечатает:

] [abc] [123] abc] [foo] bar]
] [abc_ [123] abc] [foo_ bar]
0 голосов
/ 06 октября 2011
 "^[^\[]*\[[^\]]*?(\])"

это группа (1), что вы хотите?

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