Java 正则表达式问题-匹配器需要花费大量时间进行匹配。
我想处理的源文件,其中包含以下行,该文件包含超过100列,它是制表符分隔的文件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
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!它很有魅力!上帝保佑你!:)谢谢所有其他抽出时间来帮忙的人!感谢:)这称为灾难性回溯,并在此处详细解释: