Java正则表达式:解析带有两个匹配子串的字符串

时间:2012-02-13 14:55:06

标签: java regex

我有以下字符串

  

任务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);
}

问题在于,在包含多个占位符的行中(如上所示),它只检测第一个占位符。

另一个例子:

  

任务BLABLA @ {taskId}“@ {BLABLA.title}”{start @ {startDateTime}

     

任务BLABLA2“文本”{分配RBLABLA2努力@ {BLABLA2.effort}     }}

在本文中,上面的代码检测到

  1. @ {BLABLA.title}
  2. @ {的startDateTime}
  3. @ {BLABLA2.effort}
  4. 如果我删除@ {BLABLA.title},则会检测到@ {taskId}。

    我应该如何修改代码,以便在最后一个示例中检测到所有占位符(@ {taskId},@ {BLABLA.title},@ {startDateTime},@ {BLABLA2.effort})?

3 个答案:

答案 0 :(得分:2)

删除表达式开头和结尾的贪婪的通配符匹配(.*)。然后你的正则表达式会读到:

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

删除通配符后,您还可以省略分组:

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

答案 1 :(得分:1)

删除前导和结尾。*因为它们占用了整个字符串。在您的循环中,将m.group(1)替换为m.group(0)

答案 2 :(得分:1)

//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);