gpt4 book ai didi

regex - Swift 和正则表达式,cpu 为某些字符串失控

转载 作者:行者123 更新时间:2023-11-28 10:22:08 25 4
gpt4 key购买 nike

我想用正则表达式匹配本地化行。一切正常,除非尝试匹配此字符串。您可以将代码放在 playground 中以查看它不会停止,或者将代码放在空白项目中以查看 cpu 运行 100% 并停留在“让匹配”行。现在有趣的是,如果你删除最后一个词它会起作用。我不知道是否适用于中文或其他奇怪的字符,这是希腊语。

let lineContent = "\"key\" = \" Χρήση παλιάς συνόμευση\";"
if let r = try? NSRegularExpression(pattern: "\"(.*)+\"(^|[ ]*)=(^|[ ]*)\"(.*)+\";", options: NSRegularExpressionOptions()) {
let match = r.matchesInString(lineContent, options: NSMatchingOptions(), range: NSMakeRange(0, lineContent.characters.count))
match.count
}

稍后编辑:实际上,字符类型并不重要,而是字数。这个放在右边的字符串也不起作用:'jhg jhgjklkhjkh hhhhh hhh'

最佳答案

您在 (.*)+ 中嵌套了量词,这将导致 catastrophic backtracking (我建议阅读那篇文章)。问题是当子表达式失败时,正则表达式引擎回溯以测试另一个替代方案。嵌套量词意味着主题字符串中每个字符的尝试次数将呈指数级增长:它将测试 (.*)+ 的所有重复,并且对于每个字符,还将测试 的所有重复>.*.

为避免这种情况,请使用尽可能具体定义的模式:

"\"([^\"]+)\"[ ]*=[ ]*\"([^\"]*)\";"
  • \"([^\"]+)\" 匹配
    • 开场
    • [^\"]+ 除引号外的任意数量的字符。将 + 更改为 * 以允许空字符串。
    • 结束

代码

let lineContent = "\"key\" = \" Χρήση παλιάς συνόμευση\";"
if let r = try? NSRegularExpression(pattern: "\"([^\"]+)\"[ ]*=[ ]*\"([^\"]*)\";", options: NSRegularExpressionOptions()) {
let match = r.matchesInString(
lineContent,
options: NSMatchingOptions(),
range: NSMakeRange(0, lineContent.characters.count)
)

for index in 1..<match[0].numberOfRanges {
print((lineContent as NSString).substringWithRange(match[0].rangeAtIndex(index)))
}
}

SwiftStub demo

关于regex - Swift 和正则表达式,cpu 为某些字符串失控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33537480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com