在Swift中使用特殊字符转义正则表达式
我有一个相对复杂的正则表达式,需要在Swift中运行。原来是:在Swift中使用特殊字符转义正则表达式,swift,regex,Swift,Regex,我有一个相对复杂的正则表达式,需要在Swift中运行。原来是: “typedef\W+struct\W+{([^}]*)}\W+(\W+)” 您可以看到该模式在JS中工作 为了使其在Swift中编译,我避开了反斜杠: “typedef\\W+struct\\W+{([^}]*)}\\W+(\\W+)” 在运行时,表达式无法编译,出现2048错误。我也尝试了转义其他字符,也尝试了转义字符串的模式,但运气不好。是否有将JS正则表达式转换为Swift的脚本?谢谢 您需要转义字符类之外的{和}: let
“typedef\W+struct\W+{([^}]*)}\W+(\W+)”
您可以看到该模式在JS中工作
为了使其在Swift中编译,我避开了反斜杠:
“typedef\\W+struct\\W+{([^}]*)}\\W+(\\W+)”
在运行时,表达式无法编译,出现
2048
错误。我也尝试了转义其他字符,也尝试了转义字符串的模式,但运气不好。是否有将JS正则表达式转换为Swift的脚本?谢谢 您需要转义字符类之外的{
和}
:
let rx = "typedef\\W+struct\\W+\\{([^}]*)\\}\\W+(\\w+);"
快速演示:
let rx = "typedef\\W+struct\\W+\\{([^}]*)\\}\\W+(\\w+);"
let str = "typedef: struct { something } text;"
print(str.range(of: rx, options: .regularExpression) != nil)
// => true
当{
和}
在字符类中时,它们可能会保持不被替换(如[^}]
)
使用(回答方式),您可以获得与所有捕获组的第一个匹配:
extension NSTextCheckingResult {
func groups(testedString:String) -> [String] {
var groups = [String]()
for i in 0 ..< self.numberOfRanges
{
let group = String(testedString[Range(self.range(at: i), in: testedString)!])
groups.append(group)
}
return groups
}
}
let str = "typedef: struct { something } text;"
let rx = "typedef\\W+struct\\W+\\{([^}]*)\\}\\W+(\\w+);"
let MyRegex = try! NSRegularExpression(pattern: rx)
if let match = MyRegex.firstMatch(in: str, range: NSMakeRange(0, str.count)) {
let groups = match.groups(testedString: str)
print(groups)
}
// => ["typedef: struct { something } text;", " something ", "text"]
扩展NSTextCheckingResult{
func组(testedString:String)->[String]{
变量组=[String]()
对于0..[“typedef:struct{something}text;”,“something”,“text”]
我认为您需要“typedef\\W+struct\\W+\\{([^}]*)\\}\\W+(\\W+)”
您是对的,仅转义更多的“{”和“}”,不会失败!请注意,当需要将文本字符串传递到正则表达式模式中时,escapedPatternForString
非常有用。它不应该被用来对抗正则表达式模式本身。是的,我是说它逃过了所有特殊的限制。谢谢。@Nuthinking关于从比赛中获取捕获有很多问题。例如,见。您需要只获取单个捕获组的内容吗?