正则表达式回溯引发的生产惨案

简介: 业务上的一个字段在解析时为了避免脏数据导致后续ETL的异常,决定从源头将该字段严格按照设计的规则去匹配。该字段的上传是设备端传上来的文件中的一个字段。正向?反向?

背景


业务上的一个字段在解析时为了避免脏数据导致后续ETL的异常,决定从源头将该字段严格按照设计的规则去匹配。该字段的上传是设备端传上来的文件中的一个字段。

正向?反向?

问题


业务中有这么一个正则表达式

上线后大概四个小时候用户反馈出现问题。


也就是说并不是所有的id都匹配不到,是偶发的。所以比较隐蔽。发现问题之后立即进行了退版操作。


正则如下

大家可以在这里测试测试。

regex101 测试地址


有几个id匹配不到,可实际上应该匹配到。

原因分析


这个正则匹配到这一步为啥会从头开始匹配?

使用regex101 debug mode 时,发现在匹配最后一个真这个块时发生了 pattern backtrack indicator。


没错是发生了回溯。回溯之后就匹配不到了。

为什么会发生回溯呢?

如何解决?


chatgpt 3.5


22119f4de6554d908f72d2cd7ff26033.png

GP4的表现


未完待续

目录
相关文章
|
JavaScript
JS编程建议——39:正确理解正则表达式回溯(2)
39:正确理解正则表达式回溯(2)
1044 0
|
JavaScript
JS编程建议——39:正确理解正则表达式回溯(1)
39:正确理解正则表达式回溯(1)
1010 0
|
JavaScript 前端开发 Java
《正则表达式经典实例(第2版)》——2.14 消除不必要的回溯
我们描述占有量词不会去记住回溯位置,而固化分组则会把回溯位置丢弃。这样会更容易理解匹配过程,但是读者也不要太在意这里的区别,因为很可能在你所使用的正则流派中根本不存在这样的区别。在许多流派中,‹x++›仅仅是‹(?>x+)›语法上的简写,而二者的实现则完全是一模一样的。
2011 0
|
2月前
|
编译器 Python
Python正则表达式的7个使用典范(推荐)
Python正则表达式的7个使用典范(推荐)
25 0
|
2月前
|
Python
Python实现正则表达式匹配。
【2月更文挑战第11天】【2月更文挑战第30篇】Python实现正则表达式匹配。
|
2月前
|
Python
请解释Python中的正则表达式以及如何使用它们进行文本处理。
请解释Python中的正则表达式以及如何使用它们进行文本处理。
11 0
|
2月前
|
机器学习/深度学习 Python
请解释Python中的正则表达式是什么?并举例说明其用法。
【2月更文挑战第26天】【2月更文挑战第86篇】请解释Python中的正则表达式是什么?并举例说明其用法。
|
2月前
|
缓存 数据安全/隐私保护 Python
Python快速入门:类、文件操作、正则表达式
Python快速入门:类、文件操作、正则表达式