Swift和regex,cpu为一些字符串而失控
我想用正则表达式匹配本地化行。除了尝试匹配此字符串外,所有操作都正常。你可以把代码放在操场上看它没有停止,或者放在一个空白的项目中看cpu 100%运行并卡在“让匹配”行上。现在有趣的是,如果你删除最后一个单词,它会起作用。我不知道是和中国人还是其他奇怪的角色一起工作,这是希腊语Swift和regex,cpu为一些字符串而失控,regex,swift,nsregularexpression,Regex,Swift,Nsregularexpression,我想用正则表达式匹配本地化行。除了尝试匹配此字符串外,所有操作都正常。你可以把代码放在操场上看它没有停止,或者放在一个空白的项目中看cpu 100%运行并卡在“让匹配”行上。现在有趣的是,如果你删除最后一个单词,它会起作用。我不知道是和中国人还是其他奇怪的角色一起工作,这是希腊语 let lineContent = "\"key\" = \" Χρήση παλιάς συνόμευση\";" if let r = try? NSRegularExpression(pattern: "\"(.
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 hhh hhh”正如在评论中已经提到的,
*+
正在导致灾难性的回溯,导致高CPU使用率(通常是不匹配)
而不是使用像
\"(.*)+\"
由于要匹配双引号之间的所有内容,请使用否定字符集:
\"([^\"]+)\"
正如在评论中已经提到的,
*+
正在导致灾难性的回溯,导致高CPU使用率(通常是不匹配)
而不是使用像
\"(.*)+\"
由于要匹配双引号之间的所有内容,请使用否定字符集:
\"([^\"]+)\"
根据上面的注释-将嵌套的
(.*)+
替换为惰性版本-(.*)
根据上面的注释-将嵌套的(.*)+
替换为惰性版本-(.*)在(.*)+
中有嵌套的量词,这将导致(我建议阅读那篇文章)。问题是,当一个子表达式失败时,正则表达式引擎会回溯测试另一个替代方法。使用嵌套的量词意味着主题字符串中的每个字符将有一个指数级的尝试次数:它将测试(*)+
的所有重复,以及*
的所有重复
要避免这种情况,请尽可能使用定义为特定的模式:
"\"([^\"]+)\"[ ]*=[ ]*\"([^\"]*)\";"
\”([^\“]+)\”
匹配
- 开场白
“
[^\“]+
除引号外的任意字符数。将+
更改为*
以允许空字符串
- 结束语
“
代码
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)))
}
}
let lineContent=“\”key\”=\“ρρήσηπαλιάςσννόμενση\;””
如果让r=尝试?NSRegularExpression(模式:“\”([^\“]+)\“[]*=[]*\”([^\“]*)\”;”,选项:NSRegularExpressionOptions()){
让match=r.matcheinstalling(
线条内容,
选项:NSMatchingOptions(),
范围:NSMakeRange(0,lineContent.characters.count)
)
对于1..中的索引,在(.*)+
中有嵌套的量词,这将导致(我建议阅读这篇文章)。问题是,当子表达式失败时,正则表达式引擎会回溯测试另一个替代方法。嵌套量词意味着主题字符串中的每个字符都会有指数级的尝试次数:它将测试(*)+
的所有重复,以及*
的所有重复
要避免这种情况,请尽可能使用定义为特定的模式:
"\"([^\"]+)\"[ ]*=[ ]*\"([^\"]*)\";"
\”([^\“]+)\”
匹配
- 开场白
“
[^\“]+
除引号外的任意字符数。将+
更改为*
以允许空字符串
- 结束语
“
代码
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)))
}
}
let lineContent=“\”key\”=\“ρρήσηπαλιάςσννόμενση\;””
如果让r=try?NSRegularExpression(模式:“\”([^\“]+)\“[]*=[]*\”([^\“]*)\”;”,选项:NSRegularExpressionOptions()){
让match=r.matcheinstalling(
线条内容,
选项:NSMatchingOptions(),
范围:NSMakeRange(0,lineContent.characters.count)
)
对于1中的索引。我认为问题的一部分是第一个(.*)+
-因为它将捕获前面的所有内容。尝试将其设置为惰性:(.*)
。确实要使用正则表达式吗?看起来简单的解析器就可以了,而且效率更高。(.*)中有嵌套的量词+
这将导致。可能类似于“\”([^\“]*)\“[]*=[]*\”([^\“]*)\”;”
Sideroxylon,Mariano谢谢,两种方法都有效,也许你可以把它作为一个答案来接受最闪电的一个。Kametrixom是的,值得做一个性能测试,看看哪个更好,我以前有一个解析器,我正在尝试切换到更简单的方法,它甚至不完整,我只检查开始和结束,我有一个案例,其中e开头也是结尾:“我认为问题的一部分是第一个(.*)+
,因为它将捕获前面的一切。试着让它变懒:(.*)
。你确定要使用正则表达式吗?看起来简单的解析器就可以了,而且效率更高。(.*)中有嵌套的量词+
这将导致。可能类似于“\”([^\“]*)\“[]*=[]*\”([^\“]*)\”;"
Sideroxylon,Mariano谢谢,两种方法都有效,也许你可以把它作为一个答案来接受最闪电的一个。Kametrixom是的,值得做一个性能测试,看看哪个更好,我以前有一个解析器,我正在尝试切换到更简单的方法,它甚至不完整,我只检查开始和结束,我有一个案例,其中e开始也是结束:";我最终使用了两种解决方案,这两种解决方案都用于右侧字符串,因为它接受空字符串,而另一种解决方案用于左侧字符串,因为我确实需要一个字符串,但它不接受空字符串。我将*
更改为+
以要求左侧字符串。我最终使用了两种解决方案,这两种解决方案都用于右侧字符串ring,因为接受空字符串,另一个用于左侧字符串,因为我确实需要一个字符串,它不接受空字符串。我将*
更改为+
以要求左侧字符串