带有制表符的java模式

teq*_*ras 1 java tabs pattern-matching

我有一个文件,其中包含以下行:

string1 (tab) sting2 (tab) string3 (tab) string4
Run Code Online (Sandbox Code Playgroud)

我想从每一行得到string3 ...我现在从行开始就是string3在第二个和第三个制表符之间.是否可以采用类似的模式

Pattern pat = Pattern.compile(".\t.\t.\t.");
Run Code Online (Sandbox Code Playgroud)

eri*_*urk 6

String string3 = tempValue.split("\\t")[2];
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

听起来你只是想要:

foreach (String line in lines) {
    String[] bits = line.split("\t");
    if (bits.length != 4) {
        // Handle appropriately, probably throwing an exception
        // or at least logging and then ignoring the line (using a continue
        // statement)
    }
    String third = bits[2];
    // Use...
}
Run Code Online (Sandbox Code Playgroud)

(您可以转义字符串,以便正则表达式引擎必须将反斜杠-t解析为制表符,但您不必.上述工作正常.)

String.split使用正则表达式的内置方法的另一种替代方法是Guava Splitter类.可能没有必要在这里,但值得注意.

编辑:如评论中所述,如果您要重复使用相同的模式,编译单个Pattern并使用更有效Pattern.split:

private static final Pattern TAB_SPLITTER = Pattern.compile("\t");

...

String[] bits = TAB_SPLITTER.split(line);
Run Code Online (Sandbox Code Playgroud)

  • @AndreiBodnarescu:两个独立行动的人并不是真正的帮派,不是吗?不,你仍然没有解释为什么当我使用相同的方法(`split`)时,你应该"首先看看Java内置的库所提供的内容".究竟你在暗示我应该寻找什么,我显然不知道?Java的哪一部分"优化且更具可读性"?你的第一个评论*看起来像你没有发现我已经在使用`split`.如果你说你*已经*正确地阅读了我的答案,这是一个非常令人困惑的评论,我根本不明白. (2认同)