Невозможно получить регулярное выражение в Swift, чтобы соответствовать "не содержащий" - PullRequest
0 голосов
/ 24 марта 2020

Я не могу заставить работать следующее регулярное выражение. Должно совпадать, когда строка не начинается с «quick:». Эта строка регулярного выражения происходит из бэкэнда, возможно, я смогу ее изменить, но я не могу изменить ее на префиксный тест в коде, так как можно использовать любое регулярное выражение.

Я пытался использовать .range ( из):

extension String {
    func regexMatch(_ pattern: String) -> Bool {
        return self.range(of: pattern, options: .regularExpression) != nil
    }
}

XCTAssertTrue("No".regexMatch(#"/^(?!quick:)/"#) )       // Fails
XCTAssertFalse("quick:No".regexMatch(#"/^(?!quick:)/"#)) // Passes

Но первый тест не пройден. Поэтому я попытался NSRegularExpression

extension String {    
    // https://gist.github.com/torinkwok/799784dc28fd85e4751b935696030a1d
    func match(_ pattern: String, options: NSRegularExpression.Options = []) throws -> Bool {

        let regex = try NSRegularExpression(pattern: pattern, options: options)
        return regex.numberOfMatches(in: self,
                                     options: [],
                                     range: NSRange(location: 0, length: 0.distance(to: utf16.count))) != 0
    }
}

XCTAssertTrue(try "No".match(#"/^(?!quick:)/"#) )       // Fails
XCTAssertFalse(try "quick:No".match(#"/^(?!quick:)/"#)) // Passes

И это также не удается. Я подключил Regex к онлайн-контролеру, чтобы убедиться, что он работает и работает. Кто-нибудь может пролить свет на то, почему это не работает в Swift?

1 Ответ

1 голос
/ 24 марта 2020

Я не уверен, какова цель символов # и \ "в строках, но упрощение регулярных выражений прекрасно работает на этой игровой площадке, которую я сделал:

import UIKit
var str = "Hello, playground"
extension String {
    // https://gist.github.com/torinkwok/799784dc28fd85e4751b935696030a1d
    func match(_ pattern: String, options: NSRegularExpression.Options = []) throws -> Bool {

        let regex = try NSRegularExpression(pattern: pattern, options: options)
        return regex.numberOfMatches(in: self,
                                     options: [],
                                     range: NSRange(location: 0, length: 0.distance(to: utf16.count))) != 0
    }
}

let shouldBeTrue = try "No".match("^(?!quick:)")
let shouldBeFalse = try "quick:No".match("^(?!quick:)")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...