首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在这个RegExp中,导致无限循环的错误在哪里?

在这个RegExp中,导致无限循环的错误在哪里?
EN

Stack Overflow用户
提问于 2018-06-17 09:14:57
回答 1查看 52关注 0票数 0

以下是JS中的调用:

代码语言:javascript
运行
复制
'Москва, Щёлковское шоссе д.3 строение 1 - Торговый Центр Город Хобби - 3 этаж, павильон 310, 105122'.match(/(?:[а-яА-ЯёЁ0-9\-\.\(\)]+\s?)+,?\s?(?:[а-яА-ЯёЁ0-9\-\.\(\)]+\s?)+(?:г|гор|город|п|пос|поселок|д|дер|деревня|ул|улица|пр|просп|пр-т|проспект|п|пл|площадь|ал|аллея|бул|б-р|дор|наб|пер|пр|пр-д|туп|ш|шос|шоссе|к|кор|корп|корпус|стр|строение|зд|зд-е|здание|вор|ворота|д|дом|секция)\.?\s?,?\s?(?:г|гор|город|п|пос|поселок|д|дер|деревня|ул|улица|пр|просп|пр-т|проспект|п|пл|площадь|ал|аллея|бул|б-р|дор|наб|пер|пр|пр-д|туп|ш|шос|шоссе|к|кор|корп|корпус|стр|строение|зд|зд-е|здание|вор|ворота|д|дом|секция)\.?\s?[а-яА-Я0-9ёЁ№\-\/()]+,?\s?(?:г|гор|город|п|пос|поселок|д|дер|деревня|ул|улица|пр|просп|пр-т|проспект|п|пл|площадь|ал|аллея|бул|б-р|дор|наб|пер|пр|пр-д|туп|ш|шос|шоссе|к|кор|корп|корпус|стр|строение|зд|зд-е|здание|вор|ворота|д|дом|секция)\.?\s?[а-яА-Я0-9ёЁ№\-\/()]+/gi)

它会导致无限的调用,所以控制台会被卡住。我想这里出了点问题,但找不到这个错误。

另外,我认为这不是V8中的一个错误,所以伙计们,请看这个。看起来瓶颈是导致在循环中搜索匹配的最后一部分[а-яА-Я0-9ёЁ№\-\/()]+

我怎么才能修好它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-17 09:31:38

这个问题称为灾难性回溯,它是由嵌套量词引起的:

让我们减少这一部分

代码语言:javascript
运行
复制
(?:[а-яА-ЯёЁ0-9\-\.\(\)]+\s?)+

一些更易读的东西:

代码语言:javascript
运行
复制
(?:[0-9]+\s?)+

现在想象一下像12345这样的数字。上面的regex有几个匹配选项:

代码语言:javascript
运行
复制
12345
1234, 5
123, 45
123, 4, 5
12, 345
12, 3, 45
12, 34, 5
12, 3, 4, 5
[...]

如果regex最初无法匹配,那么它必须尝试所有这些--毕竟,也许不同的组合可能会起作用,而我们还没有尝试过。

因此,避免嵌套量词,或者确保它们不允许所有这些排列,例如不使\s可选:

代码语言:javascript
运行
复制
(?:[а-яА-ЯёЁ0-9\-\.\(\)]+\s)+

或者将空格添加到字符类中:

代码语言:javascript
运行
复制
[а-яА-ЯёЁ0-9\-.()\s]+

使筑巢变得没有必要。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50895270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档