-2

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

[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));
    } 
4

1 回答 1

0

编辑: http: //fiddle.re/6ykc

正则表达式:

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

Java 正则表达式字符串:

"\\[([\\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]+)";

并找到它,然后找到可以使用 <> 作为关键字符来选择的参数:

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

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

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

希望有帮助。


原件

不完全确定格式,是“<”和“>”和“|” 必需的?命令、version_software、version_protocol 和 message 的格式是什么?这是我对正则表达式的尝试(在 Python 中测试)

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

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

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

它至少应该给出 python 中的所有标记。我把它留得更硬编码,以便为您想要抓取的每个令牌留出调整空间,否则您可以通过将其设为一个组并重复 3 次来减少最后 3 个部分。让我知道结果?

于 2012-06-12T17:32:04.620 回答