学习 swift 正则表达式(一)

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

正则表达式是一种强大的文本处理工具,可用于在字符串中搜索、匹配和操作特定模式。在 Swift 中,我们可以使用 NSRegularExpression 类来处理正则表达式相关的操作。今天来简单介绍下。

创建正则表达式

在使用正则表达式之前,我们需要先创建一个 NSRegularExpression 实例。这可以通过调用其便利构造器完成,并传入我们想要匹配的模式字符串。

swift 复制代码
let pattern = "^1(3|4|5|6|7|8|9)\\d{9}$"
let phoneNumber1 = "13800138000"
do {
    let regex = try NSRegularExpression(pattern: pattern)
    let range = NSRange(location: 0, length: phoneNumber1.utf16.count)
    print("\(phoneNumber1) 是否为一个手机号: \(regex.firstMatch(in: phoneNumber1, options: [], range: range) != nil)")
    
} catch {
    print("Invalid pattern: \(error.localizedDescription)")
}

在上面的示例中,我们创建了一个用于匹配手机号码格式的正则表达式模式。最终结果打印:13800138000 是否为一个手机号: true

匹配字符串

使用 matches 方法可以检查一个字符串是否与正则表达式模式匹配。该方法返回一个布尔值,比如我们用下边这份代码检测字符串中是否包含手机号。

php 复制代码
let pattern = "1(3|4|5|6|7|8|9)\\d{9}$"
let regex = try! NSRegularExpression(pattern: pattern)
let string = "我的手机号是 13800138000"
let range = NSRange(location: 0, length: string.utf16.count)
let matches = regex.matches(in: string, options: [], range: range)

if matches.isEmpty {
    print("字符串中不包含手机号")
} else {
    print("字符串中包含手机号")
}

查找匹配项

matches(in:options:range:) 方法不仅可以检查字符串是否匹配模式,还可以返回所有匹配项在字符串中的范围。

vbnet 复制代码
let pattern = "1(3|4|5|6|7|8|9)\\d{9}"
let regex = try! NSRegularExpression(pattern: pattern)
let text = "手机号1 14545678901 手机号2 13445558912"
let range = NSRange(location: 0, length: text.utf16.count)

// 查找所有匹配的手机号
let matches = regex.matches(in: text, options: [], range: range)

// 将找到的匹配项转换为String数组
let phoneNumbers = matches.map { match -> String in
    let matchRange = match.range
    if let swiftRange = Range(matchRange, in: text) {
        return String(text[swiftRange])
    }
    return ""
}

print(phoneNumbers.filter { !$0.isEmpty })

输出:

css 复制代码
["14545678901", "13445558912"]

字符串替换

replacingMatches(in:options:range:withTemplate:) 方法允许你用指定的模板字符串替换匹配项。

swift 复制代码
let pattern = "1(3|4|5|6|7|8|9)\\d{9}"
let regex = try! NSRegularExpression(pattern: pattern)
let originalText = "这是我的旧手机号: 13800138000,请更新。"
let range = NSRange(location: 0, length: originalText.utf16.count)
let newPhoneNumber = "13900990099"
let result = regex.stringByReplacingMatches(in: originalText, options: [], range: range, withTemplate: newPhoneNumber)

print("替换后的字符串为:\(result)")

输出:

makefile 复制代码
替换后的字符串为:这是我的旧手机号: 13900990099,请更新。

捕获组

捕获组允许你从匹配项中提取特定的子字符串。在模式中使用括号 () 可以定义捕获组。

ini 复制代码
let text = "我的手机号是14545678901,朋友的手机号是13445558912。"
let pattern = "(1(3|4|5|6|7|8|9)\\d)(\\d{4})(\\d{4})"
let regex = try! NSRegularExpression(pattern: pattern)
let range = NSRange(location: 0, length: text.utf16.count)

let matches = regex.matches(in: text, options: [], range: range)

for match in matches {
    if match.numberOfRanges == 5 { // 匹配到的完整手机号 + 3个捕获组
        let phoneNumberRange = match.range(at: 0) // 完整的手机号
        let prefixRange = match.range(at: 1) // 前三位
        let middleRange = match.range(at: 3) // 中间四位
        let lastRange = match.range(at: 4) // 后四位
        
        if let phoneNumberRange = Range(phoneNumberRange, in: text),
           let prefixRange = Range(prefixRange, in: text),
           let middleRange = Range(middleRange, in: text),
           let lastRange = Range(lastRange, in: text) {
            let phoneNumber = String(text[phoneNumberRange])
            let prefix = String(text[prefixRange])
            let middle = String(text[middleRange])
            let last = String(text[lastRange])
            
            print("手机号: \(phoneNumber), 网络前缀: \(prefix), 中间四位: \(middle), 后四位: \(last)")
        }
    }
}

输出:

yaml 复制代码
手机号: 14545678901, 网络前缀: 145, 中间四位: 4567, 后四位: 8901

手机号: 13445558912, 网络前缀: 134, 中间四位: 4555, 后四位: 8912

匹配选项

NSRegularExpression 提供了几个匹配选项,允许您自定义匹配行为。以下是一些常用的选项:

  • .caseInsensitive: 不区分大小写进行匹配

  • .anchorsMatchLines: 将 ^$ 视为行的开始和结尾

  • .dotMatchesLineSeparators: 允许 . 匹配行分隔符

  • .ignoreMetacharacters: 禁用元字符(如 \?)

常用正则表达式模式

最后,分享一些在实际开发中常用的正则表达式。

  • 电子邮件地址 : ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

  • 网址 : ^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$

  • IP 地址 : ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

  • 十六进制颜色代码 : ^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$

  • 日期 (yyyy-MM-dd) : ^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$

  • 时间 (HH:mm:ss) : ^(2[0-3]|[01]?[0-9]):([0-5]?[0-9]):([0-5]?[0-9])$

总结

正则表达式是一个强大的工具,可用于执行各种文本处理任务。在 Swift 中,NSRegularExpression 类为我们提供了创建、匹配和操作正则表达式模式的功能。

在 swift 5.7 中,正则表达式的支持进行了升级,这个我们后面有时间再讲。

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
键盘敲没电1 小时前
【iOS】KVC
ios·objective-c·xcode
吾吾伊伊,野鸭惊啼1 小时前
2024最新!!!iOS高级面试题,全!(二)
ios
吾吾伊伊,野鸭惊啼1 小时前
2024最新!!!iOS高级面试题,全!(一)
ios
不会敲代码的VanGogh3 小时前
【iOS】——应用启动流程
macos·ios·objective-c·cocoa
Swift社区5 小时前
Apple 新品发布会亮点有哪些 | Swift 周报 issue 61
ios·swiftui·swift
逻辑克6 小时前
使用 MultipeerConnectivity 在 iOS 中实现近场无线数据传输
ios
dnekmihfbnmv10 小时前
好用的电容笔有哪些推荐一下?年度最值得推荐五款电容笔分享!
ios·电脑·ipad·平板
Magnetic_h1 天前
【iOS】单例模式
笔记·学习·ui·ios·单例模式·objective-c
归辞...1 天前
「iOS」——单例模式
ios·单例模式·cocoa
yanling20231 天前
黑神话悟空mac可以玩吗
macos·ios·crossove·crossove24