我正在使用 Java 匹配器来尝试匹配以下内容:
@tag TYPE_WITH_POSSIBLE_SUBTYPE -PARNAME1=PARVALUE1 -PARNAME2=PARVALUE2: MESSAGE
TYPE_WITH_POSSIBLE_SUBTYPE 由带句点的字母组成。
每个参数都必须由字母组成,每个值都必须由数字/字母组成。可以有 0 个或多个参数。 最后一个参数值之后紧接着是分号、空格,其余部分被视为消息。
一切都需要分组。
我当前的正则表达式(作为 Java 文字)是:
(@tag)[\\s]+?([\\w\\.]*?)[\\s]*?(-.*=.*)*?[\\s]*?[:](.*)
但是,我一直将所有参数作为一组进行获取。如果可能的话,如何将每个组作为一个单独的组?
我不太用正则表达式,所以我总是把事情搞砸。
最佳答案
如果要单独捕获每个参数,则必须为每个参数都有一个捕获组。当然,你不能这样做,因为你不知道会有多少个参数。我推荐一种不同的方法:
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));
数组中的第一个元素是您的类型名称,其余(如果还有)是参数。
关于java - 解析选项字符串的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/514407/