Как остановить выражение регулярного выражения в определенной строке и перехватить подстроку? - PullRequest
1 голос
/ 22 апреля 2019

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

У меня есть эта строка

var testingString="NO Lettuce nNO Onions nNO Tomato nNO Ketchup NO  Grilled Onions NO baked Sub Zapps"

Выражение регулярного выражения, которое я использую сейчас:

let matches = self.regexMatches(for: "([^\\snNO]+|[NO]\\S+([a-zA-Z0-9_\\w+])+\\S)", in: testingString)

Я получаю вывод как:

Lettuce
Onions
Tomato
Ketchup
Grilled
Onions
baked
sub
zapps

Но я хочу, чтобы вывод был таким:

Lettuce
Onions
Tomato
Ketchup
Grilled Onions
baked sub zapps

Я использую функцию regexMatches:

func regexMatches(for regex: String, in text: String) -> [String] {
    do {
        let regex = try NSRegularExpression(pattern: regex)
        let nsString = text as NSString
        let results = regex.matches(in: text, range: NSRange(location: 0, length: nsString.length))
        var tempResults = results.map { result in
            (1..<result.numberOfRanges - 1).map { result.rangeAt($0).location != NSNotFound
                ? nsString.substring(with: result.rangeAt($0))
                : ""
            }
        }
        return tempResults.flatMap{$0}
    } catch let error {
        print("invalid regex: \(error.localizedDescription)")
        return []
    }
}

1 Ответ

0 голосов
/ 22 апреля 2019

Я бы сделал это намного проще. Просто замените nNO или NO на разделенный символ и разделите его. Теперь удалите все пробелы, удалите все пустые разбиения, и все готово.

let s = "NO Lettuce nNO Onions nNO Tomato nNO Ketchup NO  Grilled Onions NO baked Sub Zapps"
let pattern = "\\bn?NO\\b"
let regex = try! NSRegularExpression(pattern: pattern, options: [])
let s2 = regex.stringByReplacingMatches(in: s, options: [], range: NSRange(location: 0, length: s.utf16.count), withTemplate: "|")
let arr = s2.split(separator: "|", omittingEmptySubsequences: true)
    .map{$0.trimmingCharacters(in: .whitespaces)}
// ["Lettuce", "Onions", "Tomato", "Ketchup", "Grilled Onions", "baked Sub Zapps"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...