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}テキストを照合する方法が 1 つしかないため、よりもはるかに高速です。これは、必要に応じて、引用符で囲まれた値のタブをサポートするように調整することもできます。

また、1 行だけでなくファイル全体を検索するときに期待どおりに動作させたい場合は、 (?m)orフラグを使用することをお勧めします。Pattern.MULTILINE^

于 2013-03-12T06:04:45.340 に答える