我正在使用Java匹配器尝试匹配以下内容:
@tag TYPE_WITH_POSSIBLE_SUBTYPE -PARNAME1=PARVALUE1 -PARNAME2=PARVALUE2: MESSAGE
TYPE_WITH_POSSIBLE_SUBTYPE由带句点的字母组成。
每个参数必须由字母组成,每个值必须由数字/字母组成。可以有0个或更多参数。 在最后一个参数值到来之后,分号,空格和剩余部分立即被视为消息。
一切都需要分组。
我目前的正则表达式(作为Java文字)是:
(@tag)[\\s]+?([\\w\\.]*?)[\\s]*?(-.*=.*)*?[\\s]*?[:](.*)
但是,我将所有参数作为一组继续使用。如果可能的话,我如何将每个人作为一个单独的组?
我对regexp的工作量不大,所以我总是搞砸了。
答案 0 :(得分:2)
如果要分别捕获每个参数,则必须为每个参数设置一个捕获组。当然,你不能这样做,因为你不知道会有多少参数。我推荐一种不同的方法:
Pattern p = Pattern.compile("@tag\\s+([^:]++):\\s*(.*)");
Matcher m = p.matcher(s);
if (m.find())
{
String[] parts = m.group(1).split("\\s+");
for (String part : parts)
{
System.out.println(part);
}
}
System.out.printf("message: %s%n", m.group(2));
数组中的第一个元素是TYPE名称,其余的(如果有的话)是参数。
答案 1 :(得分:1)
尝试一下(您可能需要添加额外的'\'才能使其在字符串中运行。
(@tag)\s*(\w*)\s*(-[\w\d]*=[\w\d]*\s*)*:(.*)
顺便说一句,我高度推荐此网站来帮助您构建正则表达式:RegexPal。或者更好的是RegexBuddy;如果你计划将来做很多正则表达式,它的价值40美元。