簡體   English   中英

確保正則表達式與 Swift 正則表達式匹配整個字符串

[英]Make sure regex matches the entire string with Swift regex

如何檢查整個字符串是否可以與正則表達式匹配? 在 Java 中是方法String.matches(regex)

您正在尋找的是range(of:options:range:locale:)然后您可以將 range(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

編輯:您還可以使用NSPredicate並將您的字符串與它的evaluate(with:)方法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")
}

您需要使用錨點^ (字符串錨點的開頭)和$ (字符串錨點的結尾),以及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)

或者,您可以傳遞一組選項[.regularExpression, .anchored] ,其中.anchored.anchored將模式錨定在字符串的開頭,並且您可以省略^ ,但仍然需要$字符串末端的錨點:

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

查看在線 Swift 演示

此外,在MATCHES使用NSPredicate是一種替代方法:

左手表達式等於右手表達式,根據 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") 

Swift 提取正則表達式匹配

稍加修改

import Foundation

func matches(for regex: String, in text: String) -> Bool {
    do {
        let regex = try NSRegularExpression(pattern: regex)
        let nsString = text as NSString
        let results = regex.matches(in: text, range: NSRange(location: 0, length: nsString.length))
        return !results.isEmpty
    } catch let error {
        print("invalid regex: \(error.localizedDescription)")
        return false
    }
}

來自上面鏈接的示例用法:

let string = "19320"
let matched = matches(for: "^[1-9]\\d*$", in: string)
print(matched) // will match

let string = "a19320"
let matched = matches(for: "^[1-9]\\d*$", in: string)
print(matched) // will not match

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM