Java regex: анализ строки с двумя подходящими подстроками - PullRequest
1 голос
/ 13 февраля 2012

У меня есть следующая строка

task BLABLA @ {taskId} "@ {BLABLA.title}"

и хотите извлечь из него все заполнители.

Заполнителями являются @ {taskId} и @ {BLABLA.title}.

Я использую следующий код:

final Pattern pattern = Pattern.compile(".*(\\@\\{.*?\\}).*");
final Matcher matcher = pattern.matcher(this.text);

while (matcher.find())
{
    final String placeholder = matcher.group(1);
    this.placeholders.add(placeholder);
}

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

Другой пример:

task BLABLA @ {taskId} "@ {BLABLA.title}" {start @ {startDateTime}

задача BLABLA2 "Текст" {выделять усилия RBLABLA2 @ {BLABLA2.effort} }}

В этом тексте код выше обнаруживает

  1. @{BLABLA.title}
  2. @ {startDateTime}
  3. @{BLABLA2.effort}

Если я удалю @ {BLABLA.title}, то будет обнаружен @ {taskId}.

Как изменить код так, чтобы в последнем примере были обнаружены все заполнители (@ {taskId}, @ {BLABLA.title}, @ {startDateTime}, @ {BLABLA2.effort})?

Ответы [ 3 ]

2 голосов
/ 13 февраля 2012

Удалите жадные совпадения с подстановочными знаками (.*) в начале и конце выражения.Тогда ваше регулярное выражение будет иметь следующий вид:

"(\\@\\{.*?\\})"

После удаления символов подстановки вы также можете пропустить группировку:

"\\@\\{.*?\\}"
1 голос
/ 13 февраля 2012
//Another way to solve problem
String task = "task BLABLA@{taskId} \"@{BLABLA.title}";
String splitBy = "\\@\\{";
String[] splitted = task.split( splitBy );
Set<String> placeHolders = new HashSet<String>();
for( String split : splitted ) {
  int startOf = split.indexOf("}");
  if( startOf != -1 ) {
     placeHolders.add(split.substring( 0, startOf));
  }
 }
 System.out.println("place holders are " + placeHolders);
1 голос
/ 13 февраля 2012

Удалите начало и конец. * Потому что они едят всю вашу строку. В вашем цикле замените m.group(1) на m.group(0)

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