Swift中的正则表达式:iOS/macOS实用示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Swift正则表达式示例:实战演练



正则表达式(regex)是处理文本数据的强大工具。在Swift中,使用Foundation框架中的NSRegularExpression类来处理正则表达式。本文将解析Swift中正则表达式在iOS和macOS应用中的实用示例:从简单搜索到复杂的文本验证和替换。



Swift中NSRegularExpression的基础用法



NSRegularExpression类提供了处理正则表达式所需的所有方法。基本操作流程包括三个步骤:



  1. 创建正则表达式模板对象
  2. 将模板应用于字符串
  3. 处理结果(匹配、替换)


创建正则表达式



以下是如何创建并应用一个简单的正则表达式来搜索单词"Swift":



import Foundation

let text = "学习Swift和iOS开发"let pattern = "Swift"

do { let regex = try NSRegularExpression(pattern: pattern) let results = regex.matches(in: text, range: NSRange(text.startIndex..., in: text)) for match in results { if let range = Range(match.range, in: text) { print("找到: \\(text[range])") } }} catch { print("正则表达式错误: \\(error.localizedDescription)")}


请注意Range的转换——这是在Swift字符串中处理位置的标准方式。执行结果:"找到: Swift"。



实用示例1:搜索电子邮件地址



最常见的任务之一是从文本中提取电子邮件地址。以下示例将找到字符串中的所有电子邮件:



import Foundation

func findEmails(in text: String) -> [String] { let pattern = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}" var emails: [String] = [] do { let regex = try NSRegularExpression(pattern: pattern) let results = regex.matches(in: text, range: NSRange(text.startIndex..., in: text)) for match in results { if let range = Range(match.range, in: text) { emails.append(String(text[range])) } } } catch { print("错误: \\(error)") } return emails}

// 使用示例let sampleText = "联系方式: support@example.com 和 admin@site.org"let foundEmails = findEmails(in: sampleText)print(foundEmails) // ["support@example.com", "admin@site.org"]


此模板考虑了电子邮件中允许的标准字符,并检查域名部分是否存在点号。对于生产环境,可以添加对西里尔域名的支持。



实用示例2:电话号码验证



输入数据验证是任何应用程序的重要组成部分。以下是如何验证格式为+7 (XXX) XXX-XX-XX的俄罗斯电话号码:



import Foundation

func isValidPhoneNumber(_ phone: String) -> Bool { // 俄罗斯号码模板:+7 (XXX) XXX-XX-XX let pattern = "^\\\\+7\\\\s?\\\\(?[0-9]{3}\\\\)?\\\\s?[0-9]{3}-?[0-9]{2}-?[0-9]{2}$" do { let regex = try NSRegularExpression(pattern: pattern) let range = NSRange(location: 0, length: phone.utf16.count) return regex.firstMatch(in: phone, range: range) != nil } catch { return false }}

// 测试let validNumbers = ["+7 (495) 123-45-67", "+74951234567", "+7 495 1234567"]let invalidNumbers = ["8 (495) 123-45-67", "+7 (495) 123-45-678", "abc"]

for number in validNumbers { print("\\(number): \\(isValidPhoneNumber(number))") // true}

for number in invalidNumbers { print("\\(number): \\(isValidPhoneNumber(number))") // false}


该模板使用了锚点

博客

书籍推荐