1

我想处理包含以下行的源文件,文件包含超过 100 列,它是制表符分隔的文件。

private static Matcher FILE_NAME_REGEX = Pattern.compile("^\\w+\\d(F|G|H|J|K|M|N|Q|U|V|X|Z)\t169\t3(.*\t){26}\\d{4}/\\d{2}/\\d{2}.*",Pattern.CASE_INSENSITIVE).matcher("");

    String line = "CGAS0Z   169 3   38977.5 02:30:00    -350    76000   75700   2255        76000   76000   76000       588             2                               76000   06:35:15    2013/03/04                  2013/03/05  02:17:40    CGAS    1   JPY CHUKYO Gasoline                 Futures CHUKYO Gasoline CONT (CGAS3H)           JP      FUD         169                         RES     XTKT    2013/03/05  2013/03/05  2013/03/05          10  76350                                       10                                  81950   61500       4296057 19178.8258928571    224 CGAS        2013/03/25  116.3987300506  0.5196371877        75700   2255                    0.7841672   8.582539    23.298309           12.458333";

    if (FILE_NAME_REGEX.reset(line).matches()) {
        System.out.println(":)");
    } else {
        System.out.println(":(");
    }

当我测试这段代码时,它会花费很多时间。有人可以解释一下这有什么问题吗?

4

1 回答 1

4

我会这样尝试:

Pattern.compile("^\\w+\\d[FGHJKMNQUVXZ]\t169\t3([^\t]*\t){26}\\d{4}/\\d{2}/\\d{2}.*",Pattern.CASE_INSENSITIVE)

([^\t]*\t){26}应该比 快得多(.*\t){26},因为它只有一种匹配文本的方法。如果需要,这也可以调整为支持引用值中的选项卡。

此外,如果您想在搜索整个文件而不是单行时按预期工作,您将需要使用(?m)orPattern.MULTILINE标志。^

于 2013-03-12T06:04:45.340 回答