Swift 提取 Regex 匹配
在 Swift 中,您可以使用 Foundation 框架提供的 NSRegularExpression 类提取 Regex 匹配。Swift 的 NSRegularExpression 是在 Swift 中处理正则表达式的强大工具,可用于广泛的文本处理任务。
NSRegularExpression 类
您可以使用 Swift Foundation 框架类 NSRegularExpression 利用正则表达式。借助正则表达式,您可以搜索和替换文本,并创建定义字符串集合的模式。
您可以使用 NSRegularExpression 将字符串模式转换为正则表达式对象,然后可以使用该对象查找并开始处理与该模式匹配的字符串。
NSRegularExpression 的一些关键功能
- 制作正则表达式对象 −
init(pattern:options: )
初始化程序可以用作参数提供字符串模式,以制作 NSRegularExpression 对象。正则表达式由称为模式的字符串描述。 -
查找匹配项 − 有了 NSRegularExpression 对象后,您可以使用 matches(in:options:range:) 方法查找字符串中的匹配项。 返回详细说明每个匹配项的范围的 NSTextCheckingResult 对象的数组。
-
获取匹配子字符串 − 为了获得与正则表达式匹配的精确子字符串,您可以使用 Range 和 String 类。使用 Range 类可以从指定的字符范围制作定制字符串。该类定义字符串中的字符范围。
-
替换匹配子字符串 − 您可以使用
stringByReplacingMatches(in:options:range:withTemplate:)
方法使用替换字符串替换指定的子字符串。 替换字符串可以包含引用匹配子字符串的特殊替换模式。
示例1:从字符串中找到所有具有特定长度的单词
-
步骤1 − 创建输入字符串,其中包含要搜索的文本,模式是正则表达式,匹配包含完全五个字母的任何单词。
-
步骤2 − 使用 try? 运算符创建具有给定模式的 NSRegularExpression 对象,如果失败,则返回 nil。
-
步骤3 − 然后使用 NSRegularExpression 类的 matches(in:range:) 方法查找输入字符串中的所有匹配项。
-
步骤4 − 执行循环,用于使用 Range 和 String 类提取匹配子字符串。
-
步骤5 − 匹配字符串数组将包含与正则表达式模式相匹配的所有子字符串。
import Foundation
let inputString = "The quick brown fox jumps over the lazy dog."
let pattern = "\b\w{5}\b"
if let regex = try? NSRegularExpression(pattern: pattern) {
let matches = regex.matches(in: inputString, range: NSRange(inputString.startIndex..., in: inputString))
let matchStrings = matches.map { match in
String(inputString[Range(match.range, in: inputString)!])
}
print("Input string: \(inputString)")
print("Match strings: \(matchStrings)")
}
输出
Input string: The quick brown fox jumps over the lazy dog.
Match strings: ["quick", "brown", "jumps"]
示例2:从字符串中查找电子邮件地址
-
步骤1 − 创建输入字符串,其中包含要搜索的文本。模式是匹配所有电子邮件地址的正则表达式。
-
步骤2 − 使用 try? 运算符创建具有给定模式的 NSRegularExpression 对象,如果失败,则返回 nil。
-
步骤3 − 使用 NSRegularExpression 类的 matches(in:range:) 方法查找输入字符串中的所有匹配项。
-
步骤4 − 执行循环,用于使用 Range 和 String 类提取匹配子字符串。
-
步骤5 − 匹配字符串数组将包含与正则表达式模式相匹配的所有子字符串。
import Foundation
let inputString = "Contact us at info@example.com or support@example.org"
let pattern = "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}"
if let regex = try? NSRegularExpression(pattern: pattern) {
let matches = regex.matches(in: inputString, range: NSRange(inputString.startIndex..., in: inputString))
let matchStrings = matches.map { match in
String(inputString[Range(match.range, in: inputString)!])
}
print("Input string: \(inputString)")
print("Match strings: \(matchStrings)")
}
输出
Input string: Contact us at info@example.com or support@example.org
Match strings: ["info@example.com", "support@example.org"]
此示例说明如何使用正则表达式从字符串中提取所有电子邮件地址。所使用的模式是 [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,},它与具有电子邮件地址格式的任何字符串匹配。此模式匹配任何字母数字字符、点、下划线、加号和减号作为 @ 符号之前,后跟可能包含句点和连字符的域名,并以至少两个字母的顶级域名结束。
示例3:从字符串中提取所有电话号码
- 步骤1 − 创建输入字符串,其中包含要搜索的文本。模式是匹配所有电话号码的正则表达式。
-
步骤2 − 使用 try? 运算符创建具有给定模式的 NSRegularExpression 对象,如果失败,则返回 nil。
-
步骤3 − 然后使用 NSRegularExpression 类的 matches(in:range:) 方法查找输入字符串中的所有匹配项。
-
步骤4 − 执行循环,用于使用 Range 和 String 类提取匹配子字符串。
-
步骤5 − 匹配字符串数组将包含与正则表达式模式相匹配的所有子字符串。
import Foundation
let inputString = "Call us at (123) 456-7890 or (555) 123-4567"
let pattern = "\(\d{3}\) \d{3}-\d{4}"
if let regex = try? NSRegularExpression(pattern: pattern) {
let matches = regex.matches(in: inputString, range: NSRange(inputString.startIndex..., in: inputString))
let matchStrings = matches.map { match in
String(inputString[Range(match.range, in: inputString)!])
}
print("Input string: \(inputString)")
print("Match strings: \(matchStrings)")
}
输出
Input string: Call us at (123) 456-7890 or (555) 123-4567
Match strings: ["(123) 456-7890", "(555) 123-4567"]
此示例说明如何使用正则表达式从字符串中提取所有电话号码。所使用的模式是 \(\d{3}\) \d{3}-\d{4},它与格式为电话号码的任何字符串匹配。此模式匹配以开括号开头,后跟三个数字,然后是关闭括号、空格、三个数字、连字符,最后是四个数字的任何字符串。
结论
在Swift中,正则表达式是处理文本的有力工具。您可以使用Foundation框架提供的NSRegularExpression类构建和编辑正则表达式。正则表达式可用于包括查找和替换文本、提取匹配子字符串和验证输入等任务。通过学习正则表达式,您可以大大提高在Swift中处理文本的能力并成为一名高级程序员。