我有以下字符串
任务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} }}
在本文中,上面的代码检测到
如果我删除@ {BLABLA.title},则会检测到@ {taskId}。
我应该如何修改代码,以便在最后一个示例中检测到所有占位符(@ {taskId},@ {BLABLA.title},@ {startDateTime},@ {BLABLA2.effort})?
答案 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);