Swift中的正则表达式:完整指南与示例

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

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

开始课程

Swift中的正则表达式简介

\n\n

正则表达式(regex)是一种强大的工具,用于根据模式搜索、提取和替换文本。在Swift中,通过Foundation框架中的NSRegularExpression类以及内置的字符串方法来实现正则表达式操作。这是在开发iOS和macOS应用程序时,用于表单验证、数据解析、文本过滤等众多任务中不可或缺的工具。

\n\n

在本文中,我们将通过实际示例来讲解Swift中正则表达式的主要功能。您将学习如何创建模式、执行搜索、替换和提取数据。

\n\n

NSRegularExpression基础

\n\n

NSRegularExpression类是在Swift中使用正则表达式的主要方式。让我们来看一些基本操作。

\n\n

创建正则表达式

\n\n
import 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\n

查找第一个匹配项

\n\n
let 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\n
let 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\n

使用组提取数据

\n\n
let 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语法:

\n\n
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\n
let 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

替换

博客

书籍推荐