无法在Swift中获取与“不包含”匹配的正则表达式

无法在Swift中获取与“不包含”匹配的正则表达式,swift,regex,swift5,nsregularexpression,Swift,Regex,Swift5,Nsregularexpression,我似乎无法使下面的正则表达式工作。当字符串不以quick:开头时,它应该匹配。这个正则表达式字符串来自后端,我可以更改它,但我不能在代码中将其更改为前缀测试,因为任何正则表达式都可以使用 我尝试使用。范围: extension String { func regexMatch(_ pattern: String) -> Bool { return self.range(of: pattern, options: .regularExpression) != nil

我似乎无法使下面的正则表达式工作。当字符串不以quick:开头时,它应该匹配。这个正则表达式字符串来自后端,我可以更改它,但我不能在代码中将其更改为前缀测试,因为任何正则表达式都可以使用

我尝试使用。范围:

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
这也失败了。我将正则表达式插入在线正则表达式检查器,以确保它能够正常工作。
有人能解释一下为什么这在Swift中不起作用吗?

我不确定“和”的目的是什么,但简化正则表达式在我做的这个游戏中效果很好:

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:)")

谢谢你的头发。真不敢相信这么容易。我尝试了该字符串的许多组合,但肯定没有尝试仅删除“/”。是Swift 5中的一个新特性,它告诉编译器使用字符串作为文本,并且不做任何类型的插值。我很高兴我能提供帮助。谢谢你给我的提示。