CNode

一句屌炸天的正则,能把你浏览器整跪,node进程卡死

分享
Llanhaoxiang发布于10 年前最后回复10 年前11 回复5879 浏览0 收藏
/^(\d|\w){40}$/.test('12123')  //立即出结果 false
/^(\d|\w){40}$/.test('123444414213123123123123123123') //等了10几秒

如果字符串继续加长,效率会更慢

查看回复

回复 (11)

C
cllgeek#1·10 年前

意义何在??

L
lanhaoxiang#2·10 年前

@cllgeek 告诉我们开发的时候要注意 正则回溯问题

C
cllgeek#3·10 年前

@lanhaoxiang 😯这样啊

J
jsummer#4·10 年前
M
m31271n#5·10 年前

Evil RE —— 恶魔正则。

L
leeseean#6·10 年前

为什么会这样

B
bhaltair#7·10 年前
C
chita#8·10 年前

能不用正则 就不用正则

J
JZLeung#9·10 年前

24s.....

D
dlutwuwei#10·10 年前
/^(?=([\d\w]{40}))\1$/.test('123444414213123123123123123123')

或者

/^[\d\w]{40}$/.test('123444414213123123123123123123')

利用前瞻分组就可以了,前瞻分组直接匹配40个字母,失败直接丢弃,不会发生回溯 因为前瞻分组不会被捕获,所以使用反向引用匹配同一内容

这个回溯产生的原因不是因为量词嵌套,主要原因是^$之间的\d\w进行所有的组合匹配

/^\d{40}$/.test('123444414213123123123123123123')

就不会出现问题

K
kidbai#11·10 年前

第一句正则,就已经回溯,第二句更是严重咯 下面有该正则debug回溯的一个过程: https://regex101.com/r/JbqTGi/1/debugger

参与回复
登录后即可参与回复。登录