Соответствие регулярному выражению в Java - PullRequest
1 голос
/ 17 ноября 2009
String text = "[! hello ¡world ¡] otra cosa ¡]";
String pt = "\\[!(.*)¡\\]";
Matcher mc = Pattern.compile(pt).matcher(text);
while( mc.find() ){
    System.out.println(mc.group(1));
}

Этот код печатает hello ¡world ¡] otra cosa.

Каким будет шаблон, который соответствует только hello ¡world?

Чего я не нахожу, так это способа отрицать буквенную строку вместо простого символа Что-то вроде: ([^(¡\])]*)

Вопрос:
Как сопоставить все, что НЕ является литеральной строкой?

Ответы [ 4 ]

8 голосов
/ 17 ноября 2009

Просто добавьте ? после *

String pt = "\\[!(.*?)¡\\]";
4 голосов
/ 17 ноября 2009

Вам нужно выражение застенчивый или * ( не жадный ).

См. Документацию для java.util.regex.Pattern класса для синтаксиса Greedy Quantifier. В вашем случае вы хотите, чтобы ваша звезда Клини соответствовала самой короткой строке . Нормальное поведение жадное: оно соответствует самой длинной возможной строке.

1 голос
/ 18 ноября 2009

Чтобы ответить на ваш прямой вопрос, способ сопоставления . только в том случае, если он не является частью строки ¡], - использовать отрицательный прогноз:

String pt = "\\[!((?:(?!¡\\]).)*)¡\\]";
0 голосов
/ 18 ноября 2009

Альтернативным способом сопоставления строки будет использование отрицания, чтобы вы могли избежать. *? что может привести к нежелательным результатам и снижению производительности.

String pt = "\[!([^]]*)¡\]";

Эта версия будет соответствовать всему, пока не найдет скобку, и будет возвращаться только один раз, чтобы соответствовать значению ¡.

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