Regex 使用正则表达式的大字符串灾难性回溯问题

Regex 使用正则表达式的大字符串灾难性回溯问题,regex,Regex,我试图捕获两个字符串之间的所有内容,问题是我要捕获的字符串可以长达3000行的数字和逗号。所以当这种情况发生时,我得到了一个灾难性的回溯错误 这是我正在使用的正则表达式,也是下面的示例数据 NEM12[\s\S]+?<\/CSVIntervalData> NEM12[\s\s]+? 100,NEM12201807290900,WBAYM,EEQ 2003030910307,B1E1K1Q1,03,B1,N191111580,kWh,30, 30020180728、.278、.27

我试图捕获两个字符串之间的所有内容,问题是我要捕获的字符串可以长达3000行的数字和逗号。所以当这种情况发生时,我得到了一个灾难性的回溯错误

这是我正在使用的正则表达式,也是下面的示例数据

NEM12[\s\S]+?<\/CSVIntervalData>
NEM12[\s\s]+?
100,NEM12201807290900,WBAYM,EEQ 2003030910307,B1E1K1Q1,03,B1,N191111580,kWh,30, 30020180728、.278、.278、.278、.278、.278、.278、.278、.278、.278、.278、.056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.074、.278、.278、.278、.278、.278、.278、.278、.278、.278、.278、.278、.278、.278、.278、.278、.278、E75、, 900

请注意,中间可能有上千行数字、点和逗号。

基于延迟匹配模式,如果需要匹配的字符串很长,这意味着正则表达式引擎会有大量开销。当匹配
NEM12
时,将尝试
,一旦引擎找不到它,它将展开
[\s\s]*?
模式,匹配任何字符,然后再次重新测试
模式,依此类推。一旦它多次这样做,您可能会遇到问题(在regex101中,您通常会看到超时问题,而不是灾难性的回溯,因为这里没有回溯,只有贪婪模式才会触发回溯)

您可以做的是打开惰性模式:

NEM12[^<]*(?:<(?!/CSVIntervalData>)[^<]*)*</CSVIntervalData>

请参阅。

标记中的点是否应该存在(即
/
)?
\s\s
=
,否?(如果您的正则表达式风格不包括带有
的换行符,请添加相应的修饰符。)请指定您在标记中使用的语言/工具一些问题:您的示例标记中有点,它们是打字错误吗?您运行正则表达式的环境是什么?您可以提供一个复制错误的示例(通过regex101、ideone或pastebin链接)吗?我认为OP不想捕获结束标记。@Jorge.V对,这就是为什么我的模式没有捕获组。我的意思是,引用OP:“我试图捕获两个字符串之间的所有内容”,+他的示例中没有捕获组,我认为他希望匹配标签之间的任何内容。但这个问题令人困惑。@Jorge.V好的,我添加了一个捕获组的变体。++希望这对OP有所帮助。
NEM12([^<]*(?:<(?!/CSVIntervalData>)[^<]*)*)</CSVIntervalData>
     ^                                     ^