Swift - разделение строк с помощью регулярных выражений - игнорирование строки поиска - PullRequest
0 голосов
/ 10 ноября 2018

Здесь дан умный 1-й ответ для разбиения быстрой строки с выражением регулярного выражения

ответ с разделенной строкой

Однако он сохраняет искомый текст в массиве ответов. Я пытаюсь сделать то же самое, но игнорирую символы, действующие как разделители (например, точно так же, как функция разделения swift, но только с выражением регулярного выражения в качестве разделителя).

В качестве примера: регулярное выражение будет что-то вроде

"\\\||Z|ZY"

и при применении к строке "hi|thisZshouldZYbe|separated" вы получите массив

["hi", "this", "should", "be", "separated"]

NB. Регулярное выражение адаптировано к быстрому формату NSRegularExpression с двойным экранированием. В регулярном регулярном выражении это будет просто "\ || Z | ZY" Также примечание: регулярное выражение содержит символ вертикальной линии, а не букву "l"

Возможно, вам не нужно делать слишком много настроек для оригинала, чтобы сделать работу.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Я предлагаю создать строку UUID в качестве разделителя, затем заменить вхождения шаблона регулярного выражения на эту строку UUID и разбить строку.

let string = "hi|thisZshouldZYbe|separated"
let uuid = UUID().uuidString
let result = string.replacingOccurrences(of: "\\||ZY?", with: uuid, options: .regularExpression).components(separatedBy: uuid)

Ваш шаблон работает только в другом порядке ИЛИчасти ("\\||ZY|Z")

0 голосов
/ 10 ноября 2018

Вы можете определить расширение следующим образом:

extension String {
    func split(usingRegex pattern: String) -> [String] {
        //### Crashes when you pass invalid `pattern`
        let regex = try! NSRegularExpression(pattern: pattern)
        let matches = regex.matches(in: self, range: NSRange(0..<utf16.count))
        let ranges = [startIndex..<startIndex] + matches.map{Range($0.range, in: self)!} + [endIndex..<endIndex]
        return (0...matches.count).map {String(self[ranges[$0].upperBound..<ranges[$0+1].lowerBound])}
    }
}

let str = "hi|thisZshouldZYbe|separated"
let separator = "\\||ZY?"
let result = str.split(usingRegex: separator)
print(result) //->["hi", "this", "should", "be", "separated"]

Приведенный выше код работает не так, как вы ожидаете, когда используете "\\||Z|ZY", но я думаю, что вы можете изменить свой шаблон для соответствия этому расширению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...