Swift 正则表达式匹配提取


在Swift中,您可以使用Foundation框架提供的NSRegularExpression类提取正则表达式匹配项。Swift的NSRegularExpression是处理Swift中正则表达式的强大工具,可用于各种文本处理任务。

NSRegularExpression 类

您可以使用名为NSRegularExpression的Swift Foundation框架类来使用正则表达式。借助正则表达式,您可以搜索和替换文本,以及创建定义字符串集合的模式。

您可以使用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 − matchStrings数组将包含与正则表达式模式匹配的所有子字符串。

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 − matchStrings数组将包含与正则表达式模式匹配的所有子字符串。

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 − matchStrings数组将包含与正则表达式模式匹配的所有子字符串。

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处理文本的熟练程度,并在编程方面取得进步。

更新于:2023年4月25日

2K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.