无法让 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 中的正则表达式匹配“不包含”的主要内容,如果未能解决你的问题,请参考以下文章