Escape Ege с помощью специальных символов в Swift - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть относительно сложное регулярное выражение, которое мне нужно запустить в Swift.Первоначально было:

"typedef\W+struct\W+{([^}]*)}\W+(\w+);"

Вы можете увидеть шаблон, работающий в JS здесь .

Чтобы сделать его компиляцией в Swift, я избежал обратной косой чертыto:

"typedef\\W+struct\\W+{([^}]*)}\\W+(\\w+);"

Во время выполнения выражение не компилируется с ошибкой 2048.Я тоже пытался убежать от других персонажей и тоже пытался escapedPatternForString, но безуспешно.Есть ли скрипт для преобразования регулярных выражений JS в Swift?Спасибо!

1 Ответ

0 голосов
/ 08 февраля 2019

Вам нужно экранировать { и }, которые находятся вне класса персонажей:

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

Когда { и } находятся внутри класса символов, они могут остаться без экранирования (как в [^}]).

Используя этот код (ответ Confused Vorlon), вы можете получить первый матч со всеми группами захвата:

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"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...