课题

  1. 使用正则表达式匹配字符串

    使用正则表达式 "\d{3}-(\d{4})-\d{2}" 匹配字符串 "123-4567-89"

    返回匹配结果:’"123-4567-89" 以及 "4567"
  2. 使用正则表达式替换字符串(模式)

    使用正则表达式 "(\d+)-(\d+)-(\d+)" 匹配字符串 "123-4567-89"

    使用模式字符串 "$3-$1-$2" 替换匹配结果,返回结果 "89-123-4567"。
  3. 使用正则表达式替换字符串(回调)

    使用正则表达式 "\d+" 匹配字符串 "123-4567-89"

    将匹配结果即三个数字串全部翻转过来,返回结果 "321-7654-98"。
  4. 使用正则表达式分割字符串

    使用正则表达式 "%(begin|next|end)%" 分割字符串"%begin%hello%next%world%end%"

    返回正则表达式分隔符之间的两个字符串 "hello" 和 "world"。

Swift

import Foundation

let s = "123-4567-89,987-6543-21"
let r = try NSRegularExpression(pattern: #"\d{3}-(\d{4})-\d{2}"#)
let results = r.matches(in: s, options: [], range: NSRange(s.startIndex..., in: s))
for (i, m) in results.enumerated() {
for j in 0..<m.numberOfRanges {
print("group \(i),\(j) : \(String(s[Range(m.range(at: j), in: s)!]))")
}
} let r2 = try NSRegularExpression(pattern: #"(\d+)-(\d+)-(\d+)"#)
let s2 = r2.stringByReplacingMatches(in: s, options: [], range: NSRange(s.startIndex..., in: s), withTemplate: "$3-$1-$2")
print(s2) let r3 = try NSRegularExpression(pattern: #"\d+"#)
let results2 = r3.matches(in: s, options: [], range: NSRange(s.startIndex..., in: s))
var s3 = s
for i in (0..<results2.count).reversed() {
let rng = Range(results2[i].range, in: s3)!
s3.replaceSubrange(rng, with: s3[rng].reversed())
}
print(s3) // https://stackoverflow.com/questions/25818197/how-to-split-a-string-in-swift
extension String { func split(regex pattern: String) -> [String] { guard let re = try? NSRegularExpression(pattern: pattern, options: [])
else { return [] } let nsString = self as NSString // needed for range compatibility
let stop = "<SomeStringThatYouDoNotExpectToOccurInSelf>"
let modifiedString = re.stringByReplacingMatches(
in: self,
options: [],
range: NSRange(location: 0, length: nsString.length),
withTemplate: stop)
return modifiedString.components(separatedBy: stop)
}
} let r4 = "%(begin|next|end)%"
let s4 = "%begin%hello%next%world%end%"
print(s4.split(regex: r4)) /*
group 0,0 : 123-4567-89
group 0,1 : 4567
group 1,0 : 987-6543-21
group 1,1 : 6543
89-123-4567,21-987-6543
321-7654-98,789-3456-12
["", "hello", "world", ""]
*/

使用第三方库

使用标准库解决正则表达式问题过于繁琐

下面使用第三方库 CrossroadRegex

CrossroadRegex - Advanced regular expressions for Swift

import Foundation

let s = "123-4567-89,987-6543-21"
let r = #"\d{3}-(\d{4})-\d{2}"#.r!
r.findAll(in: s).enumerated().forEach { (i, m) in
for j in 0..<m.ranges.count {
print("group \(i),\(j) : \(m.group(at: j)!)")
}
} let r2 = #"(\d+)-(\d+)-(\d+)"#.r!
let s2 = r2.replaceAll(in: s, with: "$3-$1-$2")
print(s2) let r3 = #"\d+"#.r!
let s3 = r3.replaceAll(in: s) { String($0.matched.reversed()) }
print(s3) let r4 = "%(?:begin|next|end)%".r!
let s4 = "%begin%hello%next%world%end%"
print(r4.split(s4)) /*
group 0,0 : 123-4567-89
group 0,1 : 4567
group 1,0 : 987-6543-21
group 1,1 : 6543
89-123-4567,21-987-6543
321-7654-98,789-3456-12
["", "hello", "world", ""]
*/

正则表达式(Swift)的更多相关文章

  1. 工作随笔——UIButton的EdgeInsets + Swift中的正则表达式;

    1.UIButton的EdgeInsets UIButton的EdgeInsets方法,是用来设置title和image对于上左下右四个方向的偏移,但是很奇怪的是,刚开始只有Image,titile也 ...

  2. Swift - 正则表达式的使用(附用户名、邮箱、URL等常用格式验证)

    Swift虽然是一个新出的语言,但却不提供专门的处理正则的语法和类.所以我们只能使用古老的NSRegularExpression类进行正则匹配. 即先接受一个正则表达式的字符串,由此生成NSRegul ...

  3. [Swift]正则表达式工具类

    正则表达式工具类 import Foundation //基于NSRegularExpression api 的正则处理工具类 public struct Regex { private let re ...

  4. swift 3.0 正则表达式查找/替换字符

    1.什么是正则表达式 正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式使用单个字符 ...

  5. swift中的正则表达式

    swift中的t正则表达式 正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串" ...

  6. swift项目第九天:正则表达式的学习

    import UIKit /* 练习1:匹配abc 练习2:包含一个a~z,后面必须是0~9 -->[a-z][0-9]或者[a-z]\d * [a-z] : a~z * [0-9]/\d : ...

  7. swift 手机号、邮箱、网址等正则表达式验证

    看到一个不错的swift的 手机号.邮箱.网址等正则表达式验证,分享给大家. 支持swift3,经过修改后,亲测可用! import Foundation enum Validate { case e ...

  8. iOS - OC/Swift:验证手机号/固话用正则表达式

    /** * 验证手机号是否正确 * @param unknown_type $mobile */ OC: - (BOOL)isMobileNumber:(NSString *)mobileNum { ...

  9. [Swift]LeetCode10. 正则表达式匹配 | Regular Expression Matching

    Given an input string (s) and a pattern (p), implement regular expression matching with support for  ...

随机推荐

  1. 打开Visual Studio 2012的解决方案 连接 Dynamics CRM 2011 的Connect to Dynamics CRM Server 在其工具下没有显示

    一.使用TFS 代码管理,发现Visual Studio 2012 菜单栏 工具下的Connect to Dynamics CRM Server 没有显示. 平常打开VS下的工具都会出现Connect ...

  2. Mac 平台安装 Android Studio 集成 Android SDK

    最近写个小工具,给周边一些朋友用用(类似任务执行),一开始 任务执行用Python写的,部署在云端,有一些局限(资金开销):现准备写一个任务端,需要用到的人直接装个客户端就行,于是准备写个客户端版本的 ...

  3. 【数据库】mysql的安装

    打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩,运行“setup.exe”,出现如下界面 mysql安装向导启动,按“Next”继续 选择安装类型,有“Typic ...

  4. linux下syscall函数 间接系统调用

    NAME              syscall - 间接系统调用 SYNOPSIS              #define _GNU_SOURCE               #include ...

  5. bzoj 3795: 魏总刷DP

    Description 魏总,也就是DP魏又开始刷DP了.一共有n道题,第i道题魏总原本需要u[i]秒的时间.不过,为了表达对这些水题的藐视,魏总决定先睡k秒再开始刷题.魏总并不清楚自己会睡多久,只知 ...

  6. dubbo框架及dubbo环境搭建

    https://blog.csdn.net/liuhaiabc/article/details/52781351 dubbo框架及dubbo环境搭建

  7. [UE4]Pawn和Controller,第一人称和第三人称切换

    一. Pawn 可以被控制的Actor,可以被Controller持有控制,并且从Controller中接受输入.例如:玩家.NPC(Not Player Character) 二.Controlle ...

  8. Ubuntu16.04LTS中使用 apt-get install 出现错误 Could not get lock /var/lib/dpkg/lock 的解决方案

    背景 近期,在Ubuntu 16.04 LTS 的操作系统中,安装MySQL-python的时候出现缺少依赖包的情况: 当使用命令 # sudo apt-get install xxx 安装依赖包的时 ...

  9. webpack(5)--Resolve

    Resolve webpack在启动后会从配置的入口模块触发找出所有依赖的模块,Resolve配置webpack如何寻找模块对应的文件.webpack内置JavaScript模块化语法解析功能,默认会 ...

  10. mysq更新(六) 单表查询 多表查询

      本节重点: 单表查询 语法: 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY fiel ...