2

我正在使用 Java。我需要使用 regex 解析以下行:

<actions>::=<action><action>|X|<game>|alpha

它应该给我标记<action>, <action>,X<game>

什么样的正则表达式会起作用?

我正在尝试类似的东西:"<[a-zA-Z]>"但这并不关心Xor alpha

4

4 回答 4

5

你可以尝试这样的事情:

String str="<actions>::=<action><action>|X|<game>|alpha";
str=str.split("=")[1];
Pattern pattern = Pattern.compile("<.*?>|\\|.*?\\|");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
    System.out.println(matcher.group());
}
于 2013-03-07T06:18:32.087 回答
1

你应该有这样的东西:

String input = "<actions>::=<action><action>|X|<game>|alpha";
Matcher matcher = Pattern.compile("(<[^>]+>)(<[^>]+>)\\|([^|]+)\\|(<[^|]+>)").matcher(input);
while (matcher.find()) {
     System.out.println(matcher.group().replaceAll("\\|", ""));
}

您没有指定是否要返回alpha,在这种情况下,它不会返回它。

|\\w*您可以通过添加到我写的正则表达式的末尾来返回 alpha 。

这将返回:

<action><action>X<game>
于 2013-03-07T06:16:04.727 回答
0

从原始模式来看,不清楚你的意思是否真的有 <> 在模式中,我会接受这个假设。

String pattern="<actions>::=<(.*?)><(.+?)>\|(.+)\|<(.*?)\|alpha";

对于 java 代码,您可以使用 Pattern 和 Matcher:这是基本思想:

   Pattern p = Pattern.compile(pattern, Pattern.DOTALL|Pattern.MULTILINE);
   Matcher m = p.matcher(text);
   m.find();
   for (int g = 1; g <= m.groupCount(); g++) {
      // use your four groups here..
   }
于 2013-03-07T06:08:23.370 回答
0

您可以使用以下 Java 正则表达式:

Pattern pattern = Pattern.compile
       ("::=(<[^>]+>)(<[^>]+>)\\|([^|]+)\\|(<[^>]+>)\\|(\\w+)$");
于 2013-03-07T06:20:52.763 回答