Java 正则表达式问题-匹配器需要花费大量时间进行匹配。

Java 正则表达式问题-匹配器需要花费大量时间进行匹配。,java,regex,pattern-matching,Java,Regex,Pattern Matching,我想处理的源文件,其中包含以下行,该文件包含超过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 3

我想处理的源文件,其中包含以下行,该文件包含超过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(":(");
    }
当我测试这段代码的时候,它花费了很多时间。有人能解释一下这有什么问题吗?

我想这样试试:

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)
模式。多行
标志可以按预期工作。

我会这样尝试:

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)
模式。多行
标志可以按预期工作。

您希望通过此正则表达式实现什么?在Java中,正则表达式应该是“^\\w+\\d(F | G | H | J | K | M | N | Q | U | V | X | Z)\\t169\\t3(.\\t){26}\\d{4}/\\d{2}/\\d{2}”。你需要使用“\\”而不是“\”。基本上我需要在我的spring项目中使用它。(F|; G| K| K| K| K| K| K| K| U|;U|; F|; K | X | X| Z)w\w\w)w\w\d(F| F| F| F| G| F| G| K| K| X| X| X| Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)t\t\t\t\t\t\t\t\t)t\t\t(t)t(F| F| F| F| G| G| G| G)应为169,类型应为3。在某些行中,日期为空,那么我想跳过这行。我想让正则表达式来实现它。@lhuang-通常两者都可以:字符串中可以有一个文本制表符:
“\t”
,或者一个文本斜杠和一个t:
“\\t”
。在这两种情况下,模式解析器都会获得一个选项卡。不过,你是对的,通常最好使用
“\\t”
-它可以保护你不受“忽略空格”模式(
/x
,或扩展)的影响。你可能想使用
[fghjkmnquevxz]
而不是
(F | G | H | J | K | M | N | Q | U | V | x | Z)
@Kobi:我想他说的是其他所有的反睫毛,它们正确地翻了一倍,但显示为单曲,因为OP没有正确地格式化代码。这是关于
“\\t”
的一个很好的观点。我复制了(现在格式正确)regex字符串,并使用其“从Java字符串粘贴”函数将其粘贴到RegexBuddy中,所有的
\t
都被删除。直到看到你的评论我才知道发生了什么。结果表明,自由间距模式仍然是从我上次的会话中选择的。干杯!你想通过这个正则表达式实现什么?在Java中,正则表达式应该是“^\\w+\\d(F | G | H | J | K | M | N | Q | U | V | X | Z)\\t169\\t3(.\\t){26}\\d{4}/\\d{2}/\\d{2}”。你需要使用“\\”而不是“\”。基本上我需要在我的spring项目中使用它。(F|; G| K| K| K| K| K| K| K| U|;U|; F|; K | X | X| Z)w\w\w)w\w\d(F| F| F| F| G| F| G| K| K| X| X| X| Z)Z)Z)Z)Z)Z)Z)Z)Z)Z)t\t\t\t\t\t\t\t\t)t\t\t(t)t(F| F| F| F| G| G| G| G)应为169,类型应为3。在某些行中,日期为空,那么我想跳过这行。我想让正则表达式来实现它。@lhuang-通常两者都可以:字符串中可以有一个文本制表符:
“\t”
,或者一个文本斜杠和一个t:
“\\t”
。在这两种情况下,模式解析器都会获得一个选项卡。不过,你是对的,通常最好使用
“\\t”
-它可以保护你不受“忽略空格”模式(
/x
,或扩展)的影响。你可能想使用
[fghjkmnquevxz]
而不是
(F | G | H | J | K | M | N | Q | U | V | x | Z)
@Kobi:我想他说的是其他所有的反睫毛,它们正确地翻了一倍,但显示为单曲,因为OP没有正确地格式化代码。这是关于
“\\t”
的一个很好的观点。我复制了(现在格式正确)regex字符串,并使用其“从Java字符串粘贴”函数将其粘贴到RegexBuddy中,所有的
\t
都被删除。直到看到你的评论我才知道发生了什么。结果表明,自由间距模式仍然是从我上次的会话中选择的。干杯!非常感谢kobi!它很有魅力!上帝保佑你!:)谢谢所有其他抽出时间来帮忙的人!感谢:)这被称为灾难性回溯,并在这里详细解释:感谢一吨kobi!它很有魅力!上帝保佑你!:)谢谢所有其他抽出时间来帮忙的人!感谢:)这称为灾难性回溯,并在此处详细解释: