用正则表达式选择文本中的字符串

时间:2015-03-15 20:14:15

标签: java regex

您好,我的文字文件构建如下:

1   name1   _   opt1    _    no1    _    no2   
3   name2   _   opt2    _    no3    _    no4
2   name3   _   opt3    _    no5    _    no6

我必须从每一行中选择nameX和optX。文本是在第一列和第二列之间分隔的选项卡,在其他列之间还有两个选项卡分隔符之间的_。 我可以选择"X nameX _ optX",但我也不想在nameX之前选择数字和标签除数。我使用的正则表达式是:"\\.*\t_\t\\.*"

这里是java代码:

ArrayList<ArrayList<String>> listDic = new ArrayList<ArrayList<String>>();

    BufferedReader reader = new BufferedReader(new FileReader(filename));

    int countLine = 0;

    while (true) {
        String line = reader.readLine();
        if (line == null) {
            reader.close();
            break;
        } else {
            Scanner s = new Scanner(line).useDelimiter("\\.*\t_\t\\.*");

            listDic.add(new ArrayList<String>());
            listDic.get(countLine).add(0, s.next());
            System.out.println(listDic.get(countLine).get(i));
            // System.out.println(listDic.get(i));

            listDic.add(new ArrayList<String>());
            listDic.get(countLine).add(1, s.next());
            System.out.println(listDic.get(countLine).get(i));
            // System.out.println(listDic.get(countLine));

            countLine++;
        }
    }

2 个答案:

答案 0 :(得分:1)

也许你正在寻找:

String[] tokens = line.split("\t_\t");

例如:

String string = "2\tname3\t_\topt3\t_\tno5\t_\tno6";
System.out.println(Arrays.toString(string.split("\t_\t")));

产生

[2  name3, opt3, no5, no6]

如果您想按标签 "\t_\t"进行拆分,可以使用"[\t_]+"作为拆分。

答案 1 :(得分:0)

一些事情:

  • 您的分隔符字符串需要调整(见下文)。它应该考虑到这样一个事实:总是有一个标签,有时是下划线,后面跟着第二个标签。
  • 您可能并不想创建ArrayList两次。
  • 只需再次拨打next()即可跳过扫描仪读取的第一个令牌。
  • 此处变量i未定义;我想这个代码是使用循环从某个地方剪切/粘贴的。

也许这样的事情适合你:

ArrayList<ArrayList<String>> listDic = new ArrayList<ArrayList<String>>();

BufferedReader reader = new BufferedReader(new FileReader(filename));

for (int countLine = 0;; countLine++) {
    String line = reader.readLine();
    if (line == null) {
        reader.close();
        break;
    }

    Scanner s = new Scanner(line);
    s.useDelimiter("\t(_\t)?");

    ArrayList<String> tokens = new ArrayList<String>();
    s.next(); // Skip the first token
    tokens.add(s.next());  // Take the second token (name)
    tokens.add(s.next());  // Take the third token (opt)
    listDic.add(tokens);

    System.out.println(listDic.get(countLine).get(0));
    System.out.println(listDic.get(countLine).get(1));
}