我有一个正则表达式,可以处理多达1000条记录。但是当它出现时,它显示堆栈溢出错误。我在java代码中使用这个正则表达式。 (蚀)
这是我的正则表达式:
X00(X01((P00){1}(T00){1,99}){1,9999}H00)V99
数据将出现在具有特定出现次数的单行记录中。
以下是数据示例
X00X01P00T00T00T00P00T00T00T00T00T00H00V99
特定单词的最大限制在正则表达式和整个组发生中也被提及(1,9999}。并且在一个组内P00将发生一次而T00发生多达99次并且该组本身可以是重复本身可以重复多达9999次。我希望它现在清楚了。
在这个正则表达式中可以做些什么来匹配上面正则表达式中提到的这种模式的长数据...最多10000条记录?
答案 0 :(得分:1)
由于您希望记录与整个模式匹配,您应该在正则表达式中添加字符串开头(^
)和字符串结尾($
)锚点。这样就可以避免在一行中的其他位置进行匹配尝试,无论如何你都不希望这样匹配。
根据您是否一次解析所有记录,您可能需要指定多线修改器:m
。
其次,{1,9999}
中的大数字可能会导致某些正则表达式解析器出现问题。如果确实存在问题,那么你可以做的事情就不多了,因为它与编译的正则表达式的大小有关。在这种情况下,您可以尝试使用否定前瞻来查看您没有超过9999次出现,并且当它过去时,只需执行+
(即"一个或多个&# 34;),但它在reg101.com上遇到了同样的问题(表达式太大):
^X00((?!(?:.*?P){10000})X01((P00)(?!(?:T00){100})(T00)+)+H00)V99$
如果数字99和9999不是非常严格的限制,那么你可以拿出那些负面的预测((?! .... )
):这真的可以节省时间。
(?! ... )
(?!(?:.*?P){10000})
(?!
:开始否定前瞻:这不会"吃"任何角色,但展望未来。(?:
:非捕获组的开始。与普通括号类似,但您无法反向引用它们。.*?P
:任何符合" P"。{10000}
:计算多次出现,实际上意味着:看看你是否能找到10000" P"在字符串中:如果是这样,前瞻成功,但由于它是否定前瞻,匹配将失败,这就是目的。