[英]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
此外,在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")
稍加修改
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.