确保正则表达式与Swift正则表达式匹配整个字符串

Kam*_*ski 7 regex swift

如何检查WHOLE字符串是否可以匹配正则表达式?在Java中是方法String.matches(regex)

Nir*_*v D 6

您正在寻找的是range(of:options:range:locale:)然后您可以将范围(of:option :)的结果与整个比较字符串范围进行比较.

例:

let phoneNumber = "(999) 555-1111"
let wholeRange = phoneNumber.startIndex..<phoneNumber.endIndex
if let match = phoneNumber.range(of: "\\(?\\d{3}\\)?\\s\\d{3}-\\d{4}", options: .regularExpression), wholeRange == match {
    print("Valid number")
}
else {
    print("Invalid number")
}
//Valid number
Run Code Online (Sandbox Code Playgroud)

编辑:您还可以使用NSPredicate和比较您的字符串与其evaluate(with:)方法.

let pattern = "^\\(?\\d{3}\\)?\\s\\d{3}-\\d{4}$"
let predicate = NSPredicate(format: "self MATCHES [c] %@", pattern)
if predicate.evaluate(with: "(888) 555-1111") {
    print("Valid")
}
else {
    print("Invalid")
}
Run Code Online (Sandbox Code Playgroud)


Wik*_*żew 5

您需要使用锚点,^(字符串锚点的开始)和$(字符串锚点的结尾)range(of:options:range:locale:),通过.regularExpression选项:

import Foundation

let phoneNumber = "123-456-789"
let result = phoneNumber.range(of: "^\\d{3}-\\d{3}-\\d{3}$", options: .regularExpression) != nil
print(result)
Run Code Online (Sandbox Code Playgroud)

或者,您可以传递一个选项数组[.regularExpression, .anchored],其中.anchored将仅将模式锚定在字符串的开头,并且您可以省略^,但仍然$需要锚定在字符串的末尾:

let result = phoneNumber.range(of: "\\d{3}-\\d{3}-\\d{3}$", options: [.regularExpression, .anchored]) != nil
Run Code Online (Sandbox Code Playgroud)

查看在线 Swift 演示

此外,在这里使用NSPredicatewithMATCHES是另一种选择:

左手表达式等于右手表达式,根据 ICU v3 使用正则表达式样式比较(有关更多详细信息,请参阅 ICU正则表达式用户指南)。

MATCHES实际上在字符串的开头和结尾都锚定正则表达式匹配请注意,这可能不适用于所有 Swift 3 版本):

let pattern = "\\d{3}-\\d{3}-\\d{3}"
let predicate = NSPredicate(format: "self MATCHES [c] %@", pattern)
let result = predicate.evaluate(with: "123-456-789") 
Run Code Online (Sandbox Code Playgroud)