Swift中的正则表达式:初学者完整指南
正则表达式(regex)是一种用于搜索、替换和验证文本数据的强大工具。在Swift中,正则表达式的操作通过Foundation框架中的NSRegularExpression类实现。本文将教您如何在iOS和macOS应用中创建和使用正则表达式,分析实际示例,并掌握基本语法。
1. 正则表达式基础语法
在编写Swift代码之前,了解regex的基本符号和结构非常重要。以下是关键元素:
.— 任意字符(除换行符外)*— 前一个字符重复0次或多次+— 重复1次或多次?— 重复0次或1次(使前一个字符可选)\\d— 任意数字(0-9)\\w— 任意字母、数字或下划线[abc]— a、b或c中的任意一个字符[^abc]— 除a、b、c外的任意字符^— 字符串开头$— 字符串结尾
这些符号组合起来形成模式。例如,模式^[A-Za-z]+$表示:字符串从头到尾仅由拉丁字母组成。
2. 在Swift中创建和使用NSRegularExpression
在Swift中使用regex首先需要导入Foundation并创建NSRegularExpression实例。来看一个简单示例:查找字符串中的所有数字。
import Foundation
let text = "我的号码:123-456-7890"let pattern = "\\\\d+" // 模式:一个或多个数字
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)")}// 输出:// 找到:123// 找到:456// 找到:7890注意反斜杠的转义:Swift字符串中的"\\\\d"对应正则表达式\\d。当模式无效时,NSRegularExpression类会抛出异常,因此需要使用try-catch。
2.1. 处理NSRange
matches(in:range:)方法返回一个NSTextCheckingResult对象数组。每个结果包含找到的匹配项的范围(NSRange)。要转换为Swift Range,请使用初始化器Range(match.range, in: text)。
3. 正则表达式实际示例
我们来看三个典型任务:邮箱验证、提取URL和文本替换。
3.1. 邮箱地址验证
检查字符串是否符合简单的邮箱模式(简化版本):
func isValidEmail(_ email: String) -> Bool { let pattern = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}$" let regex = try? NSRegularExpression(pattern: pattern) let range = NSRange(location: 0, length: email.utf16.count) return regex?.firstMatch(in: email, range: range) != nil}
print(isValidEmail("test@example.com")) // trueprint(isValidEmail("invalid-email")) // false这里我们使用firstMatch,它返回第一个匹配项。如果没有匹配项,则返回nil。
3.2. 从文本中提取URL
假设我们有一个包含多个链接的字符串。提取所有URL:
let text = "访问网站 https://pythonlib.ru 或发送邮件至 support@pythonlib.ru"let pattern = "https?://[\\\\w./%-]+"
do