正则表达式匹配模式

时间:2012-06-12 17:02:10

标签: java regex

我正在尝试为这样的命令获取匹配项;

[AUTR| <version_software> | <version_protocol> | <msg> ]
[PING]

找到第一个命令匹配的正则表达式是什么?

AUTR
version_software
version_protocol
msg

这是解析它的代码:

String[] tokens =  msg.replace('<',' ').replace('>',' ').replace('[', ' ').replace(']', ' ').split("\\|");
for (int i=0; i<tokens.length; i++) tokens[i] = tokens[i].trim();

我只是想知道如何使用正则表达式解决方案。

编辑:

我正在尝试使用更简单的表达式匹配组,并且使用此代码调用m.groupCount会返回一个...但是当我尝试打印它时...它会抛出此异常“java.lang.IllegalStateException:找不到匹配“

    Pattern pattern = Pattern.compile("([\\w+])");
    Matcher m = pattern.matcher("[AUTR]");

    for (int i=0; i<m.groupCount();i++)
    {
        System.out.println(m.group(i));
    } 

1 个答案:

答案 0 :(得分:0)

修改http://fiddle.re/6ykc

正则表达式:

\[([\w]+)(\s*\|\s*<([\w. ]+)>\s*)*\]

Java Regex String:

"\\[([\\w]+)(\\s*\\|\\s*<([\\w. ]+)>\\s*)*\\]"

请注意,这适用于变量命令,并且所有额外参数必须与以下字符集匹配[a-zA-Z_0-9。 ](包括句号和空格)。

问题:可变长度命令存在一个问题,您无法捕获多个具有变量类型分组的组。

  

与组关联的捕获输入始终是该组最近匹配的子序列。如果由于量化而第二次评估组,则如果第二次评估失败,则将保留其先前捕获的值(如果有的话)。例如,将字符串“aba”与表达式(a(b)?)+匹配,将第二组设置为“b”。在每次比赛开始时丢弃所有捕获的输入。   http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#cg

编辑2:

为了获得所有这些,你可以做2个正则表达式,一个用于获取命令:

String command_regex = "\\[([\\w]+)";

然后找到并找到可以使用&lt;&gt;的参数。作为您选择的关键字符:

String parameters = "<([\\w. ]+)>";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string_to_match);

while (matcher.find()) {
    System.out.println(matcher.group());
}

希望有所帮助。


<强> ORIGINAL

格式不完全确定,是“&lt;”和“&gt;”和“|”需要?命令,version_software,version_protocol和消息的格式是什么?这是我对正则表达式的尝试(在Python中测试)

\[(\w+)\s*\|\s*<([\w.]+)>\s*\|\s*<(\w+)>\s*\|\s*<([\w\s]+)>\s*\]

你需要确保转义括号和管道符号(我之间添加了\ s *条件,因为我不知道是否有空格。如果你这样做:

>> search.re("expression above", line) 
>> search.groups()

至少应该在python中提供所有令牌。我把它更加硬编码,以便在你想要抓住的每个标记上留出空间进行调整,否则你可以通过将它作为一个组并说重复3次来减少最后3个部分。让我知道结果?