2015-04-21 16 views
18

Trong Swift, cách đơn giản để xem chuỗi có khớp với mẫu không?Swift regex: một chuỗi có khớp với mẫu không?

ví dụ Mã giả:.

if string matches pattern ... 

if string =~ pattern ... 

(Tôi đã đọc các tài liệu Swift và chưa thấy một khả năng regex Tôi đã đọc về việc thêm một =~ điều hành mới mà là một ý tưởng tốt nhưng phức tạp hơn tôi Tôi muốn thử bởi vì điều này là dành cho một dự án giảng dạy.Tôi đã thử rangeOfString nhưng nhận được lỗi: 'String' không có một thành viên 'rangeOfString'.Tôi đang tìm kiếm một giải pháp Swift, tức là không gõ NSRegularExpression.Tôi không cần phải làm bất cứ điều gì với dữ liệu kết quả trận đấu.)

+0

có thể trùng lặp của [Swift Regex Matching] (http://stackoverflow.com/questions/28776945/swift-regex-matching) – picciano

+0

@picciano Cảm ơn bạn đã liên kết - Tôi đã thêm một giải thích rằng câu hỏi này khác với câu hỏi được liên kết vì tôi chỉ muốn sử dụng cụm từ Swift chứ không phải NSRegularExpression. – joelparkerhenderson

Trả lời

39

Giải pháp phiên bản Swift 3:

if string.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil ... 

Swift giải pháp phiên bản 2:

if string.rangeOfString(pattern, options: .RegularExpressionSearch) != nil ... 

Ví dụ - không chuỗi này chứa hai chữ "o" ký tự?

"hello world".rangeOfString("o.*o", options: .RegularExpressionSearch) != nil 

Lưu ý: Nếu bạn nhận được thông báo lỗi 'String' does not have a member 'rangeOfString', sau đó thêm này trước: import Foundation. Điều này là do Foundation cung cấp các phương thức NSString được tự động bắc cầu vào lớp Swift String.

import Foundation 

Nhờ Onno Eberhard cập nhật Swift 3.

10

Để có được cú pháp bạn thực sự hỏi về, bạn có thể dễ dàng xác định một nhà điều hành mới mà kết thúc tốt đẹp các cầu nối NSString chức năng:

infix operator =~ {} 
func =~(string:String, regex:String) -> Bool { 
    return string.rangeOfString(regex, options: .RegularExpressionSearch) != nil 
} 

"abcd" =~ "ab*cd" 
"abcd" =~ "abcde+" 
+0

Cảm ơn David. Đối với dự án cụ thể này, tôi đang tìm một giải pháp không xác định toán tử mới. (Sẽ thật tuyệt nếu Swift thêm ý tưởng của bạn vào toàn bộ ngôn ngữ, IMHO) – joelparkerhenderson

9

Các giải pháp nêu trên không làm việc cho tôi nữa, vì vậy tôi đăng giải pháp của tôi ở đây (tôi đã sử dụng một phần mở rộng cho string):

extension String { 
    func matches(_ regex: String) -> Bool { 
     return self.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil 
    } 
} 

Ví dụ:

if str.matches("^[a-zA-Z0-9._-]{1,30}$") { 
    //... 
} 
+2

Xem tài liệu tham khảo, ví dụ và bản trình diễn trực tiếp của Cụm từ thông dụng tại: http://regexr.com – naeemjawaid

0

Điều này sẽ trả về xem chuỗi có khớp với một mẫu

ví dụ: matchesPattern (văn bản: "sd56Yz", mẫu: "[a-zA-Z0-9] +") true

ví dụ: matchesPattern (văn bản: "sd56 $ Yz", mẫu: "[a-zA-Z0-9] +") false

func matchesPattern(text: String?, pattern: String?) -> Bool { 
    guard hasValue(text) && hasValue(pattern) else { 
     return false 
    } 

    let range = text!.rangeOfString(pattern!, options: .RegularExpressionSearch) 

    guard range != nil else { 
     return false 
    } 

    let rangeString = text?.substringWithRange(range!) 

    return areEqual(text, string2: rangeString) 
} 
Các vấn đề liên quan