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

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

背景


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

正向?反向?

问题


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

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


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


正则如下

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

regex101 测试地址


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

原因分析


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

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


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

为什么会发生回溯呢?

如何解决?


chatgpt 3.5


22119f4de6554d908f72d2cd7ff26033.png

GP4的表现


未完待续

目录
相关文章
|
JavaScript 前端开发 Java
《正则表达式经典实例(第2版)》——2.14 消除不必要的回溯
我们描述占有量词不会去记住回溯位置,而固化分组则会把回溯位置丢弃。这样会更容易理解匹配过程,但是读者也不要太在意这里的区别,因为很可能在你所使用的正则流派中根本不存在这样的区别。在许多流派中,‹x++›仅仅是‹(?>x+)›语法上的简写,而二者的实现则完全是一模一样的。
2079 0
|
JavaScript
JS编程建议——39:正确理解正则表达式回溯(2)
39:正确理解正则表达式回溯(2)
1068 0
|
JavaScript
JS编程建议——39:正确理解正则表达式回溯(1)
39:正确理解正则表达式回溯(1)
1031 0
Python 内置正则表达式库re的使用
正则表达式是记录文本规则的代码,用于查找和处理符合特定规则的字符串。在Python中,常通过原生字符串`r'string'`表示。使用`re.compile()`创建正则对象,便于多次使用。匹配字符串有`match()`(从开头匹配)、`search()`(搜索首个匹配)和`findall()`(找所有匹配)。替换字符串用`sub()`,分割字符串则用`split()`。
|
6月前
|
数据库 Python
Python网络数据抓取(8):正则表达式
Python网络数据抓取(8):正则表达式
64 2
|
6月前
|
自然语言处理 JavaScript 前端开发
Python高级语法与正则表达式(二)
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
|
6月前
|
安全 算法 Python
Python高级语法与正则表达式(一)
Python提供了 with 语句的写法,既简单又安全。 文件操作的时候使用with语句可以自动调用关闭文件操作,即使出现异常也会自动关闭文件操作。
|
6月前
|
Python
Python使用正则表达式分割字符串
在Python中,你可以使用re模块的split()函数来根据正则表达式分割字符串。这个函数的工作原理类似于Python内置的str.split()方法,但它允许你使用正则表达式作为分隔符。