正则表达式来解析选项字符串

时间:2009-02-05 03:16:31

标签: java regex

我正在使用Java匹配器尝试匹配以下内容:

@tag TYPE_WITH_POSSIBLE_SUBTYPE -PARNAME1=PARVALUE1 -PARNAME2=PARVALUE2: MESSAGE

TYPE_WITH_POSSIBLE_SUBTYPE由带句点的字母组成。

每个参数必须由字母组成,每个值必须由数字/字母组成。可以有0个或更多参数。 在最后一个参数值到来之后,分号,空格和剩余部分立即被视为消息。

一切都需要分组。

我目前的正则表达式(作为Java文字)是:

(@tag)[\\s]+?([\\w\\.]*?)[\\s]*?(-.*=.*)*?[\\s]*?[:](.*)

但是,我将所有参数作为一组继续使用。如果可能的话,我如何将每个人作为一个单独的组?

我对regexp的工作量不大,所以我总是搞砸了。

2 个答案:

答案 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美元。