无法在 Swift 中获取正则表达式以匹配 "not containing"
Cannot get Regex in Swift to match "not containing"
我似乎无法使用以下正则表达式。当字符串不以 "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 中不起作用?
我不确定字符串中 # 和 \" 的用途是什么,但简化正则表达式在我制作的这个游乐场中工作得很好:
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:)")
我似乎无法使用以下正则表达式。当字符串不以 "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 中不起作用?
我不确定字符串中 # 和 \" 的用途是什么,但简化正则表达式在我制作的这个游乐场中工作得很好:
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:)")