Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中使用特殊字符转义正则表达式_Swift_Regex - Fatal编程技术网

在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

我有一个相对复杂的正则表达式,需要在Swift中运行。原来是:

“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关于从比赛中获取捕获有很多问题。例如,见。您需要只获取单个捕获组的内容吗?