我正在尝试为这样的命令获取匹配项;
[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));
}
答案 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个部分。让我知道结果?