2

我有一个要根据字符进行标记的字符串,。这里的问题是字符串是这样的

-123 abc, 234 def (2,3,4), -456 zyx (4,5,6) and xyz (6,5,4), 789 final!

标记化输出后应该看起来像......

-123 abc
234 def (2,3,4)
-456 zyx (4,5,6) and xyz (6,5,4)
789 final!

如何为此编写正则表达式?TIA。

4

4 回答 4

5

Tokenizer 不行,你需要一个parser。正则表达式不是特别擅长计数,这就是您需要决定在哪里结束带有逗号的括号块。

一个简单的递归下降解析器应该适用于您的情况。您可能想要花哨并尝试ANTLR。它是一个伟大而强大的工具,但对于简单的表达(例如您的示例中的表达)来说,它可能是一种过度杀伤力。

于 2012-09-05T13:18:31.933 回答
0

另一种方法是使用

Pattern p = Pattern.compile(", +");
for(String my : p.split("-123 abc,      234 def (2,3,4),  -456 zyx (4,5,6) and xyz (6,5,4), 789 final!"))
System.out.println(my);

这将找到任何带有前导空格(一个或多个)的逗号。

于 2012-09-05T13:35:44.913 回答
0

您可以通过“,”尝试不带数字的模式匹配:

Pattern pattern = Pattern.compile("^[\\d][,]^[\\d]");
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
    //Here you know where you have the separating ,
    start = matcher.start();

或者如何通过“,”进行标记?希望后面总有一个空格,你要标记化。

String test = "-123 abc, 234 def (2,3,4), -456 zyx (4,5,6) and xyz (6,5,4), 789 final!";
String[] tokens = test.split(", ");
System.out.println(Arrays.toString(tokens));
于 2012-09-05T13:19:44.683 回答
0

它可能就像这样工作:

var string = "-123 abc, 234 def (2,3,4), -456 zyx (4,5,6) and xyz (6,5,4), 789 final!";

var tokens = string.split(', '); console.log(tokens);​</p>

演示:http: //jsfiddle.net/HQgV8/

于 2012-09-05T13:21:55.693 回答