1

我有一个数据文件,其中每一行代表一条记录,每条记录可能包含一个关键字列表,每个关键字前面都有一个“+”。

foo1 foofoo foo foo foo +key1 +key2 +key3
foo2 foo foo foofoo foo 
foo3 foo foofoo foo +key1 key1 key1 +key2

将有零到理论上无限数量的关键字。关键字总是以 + 开头。单个关键字可以是单个单词,也可以是带有空格的短语。我识别关键字的策略:

我想将这些记录读入一个数组,String keywords[]. 我lineBuffer用来把数据带进来,这就是我到目前为止所拥有的。

// PSEUDOCODE
counter = [number of occurences of + in the line];
for(int i=0;i<=counter,i++) {
    Pattern p = [regex reresenting + to the next occurence of + -or- end of line];
    Match pattern;
    keyword[i] = Match.group(1) }

我可能想多了,但是 Java 是否知道在同一行中转到我的模式的下一个实例?查看这几行代码,我的模式匹配器似乎会读取该行,找到关键字的第一个实例并将其i多次写入数组。它永远不会 GET 到第二个关键字。

有没有更好的方法来思考这个问题?创建此数组的更好策略?

4

2 回答 2

2

如果您知道+键中没有,您可以简单地拆分字符串:

String[] ss = s.split(" \\+");

并丢弃第一个条目(foo fooo ...)。

编辑

关于模式/正则表达式问题,您也可以这样做:

Pattern p = Pattern.compile(" \\+\\w+");
Matcher m = p.matcher(s);
while (m.find()) {
    String key = m.group().trim().replaceAll("\\+","");
    System.out.println(key);
}
于 2012-08-08T12:18:54.800 回答
1

使用Scanner很容易做到这一点:

Scanner s = new Scanner(line);
int i = 0;
while (s.hasNext()) {
    String token = s.next();
    if (token.startsWith("+")) {
        keyword[i] = token;
        i++;
    }
}
于 2012-08-08T12:19:41.490 回答