Swift中的正则表达式简介
\n\n正则表达式(regex)是一种强大的工具,用于根据模式搜索、提取和替换文本。在Swift中,通过Foundation框架中的NSRegularExpression类以及内置的字符串方法来实现正则表达式操作。这是在开发iOS和macOS应用程序时,用于表单验证、数据解析、文本过滤等众多任务中不可或缺的工具。
在本文中,我们将通过实际示例来讲解Swift中正则表达式的主要功能。您将学习如何创建模式、执行搜索、替换和提取数据。
\n\nNSRegularExpression基础
\n\nNSRegularExpression类是在Swift中使用正则表达式的主要方式。让我们来看一些基本操作。
创建正则表达式
\n\nimport Foundation\n\nlet pattern = "[A-Za-z]+@[A-Za-z]+\\\\.[A-Za-z]+"\nguard let regex = try? NSRegularExpression(pattern: pattern) else {\n fatalError("无效的模式")\n}\n\n请注意双反斜杠\\\\——在Swift字符串中,反斜杠需要进行转义。
查找第一个匹配项
\n\nlet text = "请通过电子邮件联系我们:support@example.com"\nlet nsString = text as NSString\nlet range = NSRange(location: 0, length: nsString.length)\n\nif let match = regex.firstMatch(in: text, range: range) {\n let email = nsString.substring(with: match.range)\n print("找到电子邮件:\\(email)") // support@example.com\n}\n\n查找所有匹配项
\n\nlet text = "联系方式:info@site.com, admin@site.com, support@site.com"\nlet matches = regex.matches(in: text, range: NSRange(location: 0, length: text.count))\n\nfor match in matches {\n let range = match.range\n let email = (text as NSString).substring(with: range)\n print(email)\n}\n// 输出:\n// info@site.com\n// admin@site.com\n// support@site.com\n\n使用捕获组
\n\n捕获组允许提取匹配的部分。在Swift中,组用圆括号()表示。
使用组提取数据
\n\nlet pattern = "(\\\\d{4})-(\\\\d{2})-(\\\\d{2})"\nlet dateString = "今天:2024-03-15"\n\nguard let regex = try? NSRegularExpression(pattern: pattern) else { return }\nlet nsString = dateString as NSString\n\nif let match = regex.firstMatch(in: dateString, range: NSRange(location: 0, length: nsString.length)) {\n let fullDate = nsString.substring(with: match.range) // 2024-03-15\n let year = nsString.substring(with: match.range(at: 1)) // 2024\n let month = nsString.substring(with: match.range(at: 2)) // 03\n let day = nsString.substring(with: match.range(at: 3)) // 15\n \n print("年:\\(year), 月:\\(month), 日:\\(day)")\n}\n\n命名组(使用Range)
\n\n从Swift 5.7开始,可以使用更便捷的Range语法:
let text = "价格:1500卢布"\nlet pattern = #"(\\d+)\\s卢布"#\n\nif let range = text.range(of: pattern, options: .regularExpression) {\n let match = text[range]\n print("找到:\\(match)") // 1500卢布\n}\n\n使用正则表达式替换文本
\n\n最有用的功能之一是根据模式替换文本部分。
\n\n简单替换
\n\nlet text = "请拨打号码 +7 (123) 456-78-90"\nlet pattern = "\\\\+7\\\\s\\\\(\\\\d{3}\\\\)\\\\s\\\\d{3}-\\\\d{2}-\\\\d{2}"\nlet replacement = "[号码已隐藏]"\n\nguard let regex = try? NSRegularExpression(pattern: pattern) else { return }\nlet modifiedText = regex.stringByReplacingMatches(\n in: text,\n range: NSRange(location: 0, length: text.count),\n withTemplate: replacement\n)\n\nprint(modifiedText) // 请拨打号码 [号码已隐藏]\n\n