Regex Swift-使用正则表达式匹配不带下划线的单词需要这么多时间?

Regex Swift-使用正则表达式匹配不带下划线的单词需要这么多时间?,regex,swift,Regex,Swift,我正在使用swift,我真的不知道为什么要使用\w来匹配单词字符。它还包括下划线 这里是我的模式匹配的最后一个字 我必须使用([^\\W_]+)而不是\W,因为我不想匹配下划线 但问题在于长字符串,执行大约需要20秒 这是密码 var bs = "MIAMI — After 11 adversarial debates, the two chief antagonists to Donald J. Trump on Thursday night largely abandoned their s

我正在使用swift,我真的不知道为什么要使用\w来匹配单词字符。它还包括下划线

这里是我的模式匹配的最后一个字

我必须使用
([^\\W_]+)
而不是
\W
,因为我不想匹配下划线

但问题在于长字符串,执行大约需要20秒

这是密码

var bs = "MIAMI — After 11 adversarial debates, the two chief antagonists to Donald J. Trump on Thursday night largely abandoned their strategy of brutally attacking him, choosing instead to use their final face-off before next week’s round of big Republican primaries to project gravitas and champion conservative positions on trade, jobs and Israel."
Regexp("((\\b([^\\W_]+){1,15}\\b)([\\s]+)?){1,4}\\z").matches(s)?.last
但模式是:

Regexp("((\\b\\w{1,15}\\b)([\\s]+)?){1,4}\\z").matches(bs)?.last
只需要0.009。
这里发生了什么事?如何快速匹配没有下划线的单词字符?

什么是
bs
???请尝试
\\b[^\\W\]{1,15}(?:\\s+[^\\W\]{1,15}){1,4}\\z
。我已经用bs示例字符串解决了这个问题。你的模式匹配5个单词,而不是4个,它比我的第二个模式慢10倍。好吧,有一点是肯定的:这是灾难性的回溯。看这里。您需要展开正则表达式,将嵌套的量词取出成线性模式序列。要求是什么
([^\\W_]+){1,15}
对我来说毫无意义,因为你要求提取1个或多个字母或数字1到15次。这是你的,看起来没问题。那么,为什么不将
\\w
替换为
[^\\w\]
?像
(\\b[^\\W\]{1,15}\\b)(\\s+){1,4}\\z
?5个单词,而不是4个-因为我忘了将
{1,4}
更改为
{0,3}
(第一部分与这个重复组分开)。如果用whiespace分隔的单词的长度在1到15个字符之间,请尝试
\\b[^\\W_]{1,15}(?:\\s+[^\\W_]{1,15}){0,3}\\z
。什么是
bs
???请尝试
\\b[^\\W\]{1,15}(?:\\s+[^\\W\]{1,15}){1,4}\\z
。我已经用bs示例字符串解决了这个问题。你的模式匹配5个单词,而不是4个,它比我的第二个模式慢10倍。好吧,有一点是肯定的:这是灾难性的回溯。看这里。您需要展开正则表达式,将嵌套的量词取出成线性模式序列。要求是什么
([^\\W_]+){1,15}
对我来说毫无意义,因为你要求提取1个或多个字母或数字1到15次。这是你的,看起来没问题。那么,为什么不将
\\w
替换为
[^\\w\]
?像
(\\b[^\\W\]{1,15}\\b)(\\s+){1,4}\\z
?5个单词,而不是4个-因为我忘了将
{1,4}
更改为
{0,3}
(第一部分与这个重复组分开)。如果用whiespace分隔的单词的长度在1到15个字符之间,请尝试
\\b[^\\W_]{1,15}(?:\\s+[^\\W_]{1,15}){0,3}\\z