Java Scanner分隔符

时间:2013-02-21 16:30:18

标签: java regex parsing tokenize delimiter

我正在使用Scanner和Delimiter来标记我的.txt文件(这是我必须做的功课)。该文件的第一个版本如下所示:

5,5,5,6,5,8,9,5,6,8, good, very good, excellent, good
7,7,8,7,6,7,8,8,9,7,very good, Good, excellent, very good
8,7,6,7,8,7,5,6,8,7 ,GOOD, VERY GOOD, GOOD, AVERAGE
9,9,9,8,9,7,9,8,9,9 ,Excellent, very good, very good, excellent
7,8,8,7,8,7,8,9,6,8 ,very good, good, excellent, excellent
6,5,6,4,5,6,5,6,6,6 ,good, average, good, good
7,8,7,7,6,8,7,8,6,6 ,good, very good, good,  very good
5,7,6,7,6,7,6,7,7,7  ,excellent, very good, very good, very good

我使用useDelimiter("[ ]*(,)[ ]*")文件的第二个版本如下所示:

5 5 5 6 5 8 9 5 6 8 good, very good, excellent, good
7 7 8 7 6 7 8 8 9 7 very good, Good, excellent, very good
8 7 6 7 8 7  5 6 8 7 GOOD, VERY GOOD, GOOD, AVERAGE
9 9 9 8 9 7 9  8 9 9 Excellent, very good, very good, excellent
7 8 8 7 8 7 8 9 6 8 very good, good, excellent, excellent
6 5 6 4 5 6 5 6 6 6 good, average, good, good
7  8 7 7 6 8 7 8 6 6 good, very good, good,  very good
5 7 6 7 6 7 6 7 7 7  excellent, very good, very good, very good

我无法想出一个正则表达式,它可以帮助我用空格和单词用逗号分隔数字。基本上我需要一个包含14个值的数组(非常好的是单个变量)

请注意,有多个空格(这样做是为了让我们更难)。

所以任何形式的帮助都会受到赞赏。

P.S。我们只允许使用分隔符(没有分割等)。

4 个答案:

答案 0 :(得分:4)

这应该有效,关键是积极看待((<?=))和交替(|):

String input = "9 9 9 8 9 7 9  8 9 9 Excellent, very good, very good, excellent";
Scanner s = new Scanner(input).useDelimiter("(?<=\\d)[\\s,]+|\\s*,\\s*");
while (s.hasNext()) {
    System.out.println("Token: ." + s.next() + ".");
}

打印:

Token: .9.
Token: .9.
Token: .9.
Token: .8.
Token: .9.
Token: .7.
Token: .9.
Token: .8.
Token: .9.
Token: .9.
Token: .Excellent.
Token: .very good.
Token: .very good.
Token: .excellent.

答案 1 :(得分:2)

你可以尝试这个(((?<=[0-9]+)\s*(?=[0-9]+))|(,\s*(?=[a-zA-Z]+))|((?<=[0-9]+)\s*(?=[a-zA-Z]+))),看起来很糟糕但应该可以工作

答案 2 :(得分:2)

请注意,Scanner允许您随时更改分隔符。如果你可以依赖输入文本,开头总共有10个数字,最后有4个单词组,那么你可以简单地从一个分隔符开始,该分隔符只是分隔空格(\s+)和10次调用{{{ 1}},切换到分割的分隔符 逗号和空格(nextInt())。

类似的东西:

\s*,\s*

使用zero-width lookaround assertions使用单个分隔符正则表达式也可以这样做,但对于简单的作业问题,这可能有点高级。

答案 3 :(得分:0)

String[] str = expression.split("(,\\s+)|(\\s+)");

试试这个: