无法让 Swift 中的正则表达式匹配“不包含”

Posted

技术标签:

【中文标题】无法让 Swift 中的正则表达式匹配“不包含”【英文标题】:Cannot get Regex in Swift to match "not containing" 【发布时间】:2020-03-24 04:19:18 【问题描述】:

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

我尝试使用 .range(of):

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 中不起作用?

【问题讨论】:

【参考方案1】:

我不确定 # 和 \" 在字符串中的用途是什么,但简化正则表达式在我制作的这个操场上效果很好:

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

【讨论】:

谢谢@HaIR。不敢相信有那么容易。我尝试了该字符串的许多组合,但不能只尝试删除“/”。 # 是 Swift 5 中的一个新特性,它告诉编译器将字符串用作文字,并且不要进行任何类型的插值。

以上是关于无法让 Swift 中的正则表达式匹配“不包含”的主要内容,如果未能解决你的问题,请参考以下文章

如何用正则表达式匹配括号中的内容,不包含括号

匹配正则表达式的字符串扩展

Linux正则表达式教程:Grep Regex示例

js 正则验证输入框只允许输入正整数或者负整数?

Python:正则表达式单词匹配

swift Swift提取正则表达式匹配