这儿每天分享一个 iOS 的新知识,快来重视我吧
前言
前面介绍了一些关于正则表达式的常规用法,其实在 WWDC 2022 上,swift 5.7 中带来了字符串匹配相关的严重升级,其间就包括正则方面的新功能,今日就来讲讲。
Regex
Regex 类型是 iOS 16 新出的一个类型,运用这个类型,你能够很轻易地生成正则表达式:
letpattern=#"(d+)"#
letregex=tryRegex(pattern)
这种创建方式和 NSRegularExpression
差不多,首要,你还是需求将特殊符号用反斜杠符号,其次,你需求运用 try 来捕获异常情况。
为了防止上述情况,swift 出了一种运用两个斜杠”/…/”来直接生成 Regex
的办法,以上代码等同于:
letregex1=/(d+)/
这种通过正则语法糖的方式生成正则表达式时,能够在编译器查看是否有语法错误,还有 Xcode 语法突出显现。
运用这个表达式能够检测字符串中的称号和数字:
letregex=/(w+)s+(d+)/
letinput="Tom123xyz"
ifletresult=input.firstMatch(of:regex){
print(result.0)//Tom123
print(result.1)//Tom
print(result.2)//123
}
输出的结果是一个元组,榜首个值正则表达式匹配的所有内容,第二个值是捕获的榜首个子字符串,第三个值是捕获的第二个子字符串,以此类推。
也能够用元组命名每个属性的姓名:
letregex=/(w+)s+(d+)/
letinput="Tom123xyz"
iflet(matched,name,count)=input.firstMatch(of:regex)?.output{
print(matched)//Tom123
print(name)//Tom
print(count)//123
}
咱们还能够在正则表达式里直接命名捕获的变量:
letinput="Tom123xyz"
letregex=/(?<name>w+)s+(?<count>d+)/
ifletmatch=input.firstMatch(of:regex){
print(match.name)//Tom
print(match.count)//123
}
不同的匹配方式
swift 供给了几种不同的办法,能够用来匹配正则表达式:
//首个匹配
input.firstMatch(of:regex)
//完好匹配
input.wholeMatch(of:regex)
//前缀匹配
input.prefixMatch(of:regex)
letline="Tom1234"
//将空格替换成逗号
letline1=line.replacing(/s+/,with:",")//Tom,1234
//去除字母和空格
letline2=line.trimmingPrefix(/w+s+/)//1234
//运用空格拆分
letfields=line.split(separator:/s+/)//["Tom","1234"]
正则表达式生成器
除此之外,swift 还供给了正则表达式构建器 DSL,能够以更结构化,可读性更高的办法来构建你想要的正则表达式。
首要导入 RegexBuilder 模块:
importRegexBuilder
然后构建正则表达式:
let regex = Regex {
Capture {
OneOrMore(.word) // 一个或多个单词
}
OneOrMore(.whitespace) // 一个或多个空格
Capture {
OneOrMore(.digit) // 一个或多个数字
}
}
let input = "Tom 123 xyz"
if let match = input.firstMatch(of: regex) {
let name = match.1 // Tom
let count = match.2 // 123
}
以前的正则表达式语法非常难以回忆,有了这套 DSL 构建器之后,正则将会简单许多,除了上边用到的 OneOrMore
之外,还有许多可用的语法表达式,以下是一些常用的:
-
One 准确匹配呈现一次
-
OneOrMore 匹配呈现一次或多次
-
ZeroOrMore 匹配呈现零次或一次
-
Lookahead 仅当其内容在给定位置匹配时才答应匹配持续
-
NegativeLookahead 仅当其内容在给定方位不匹配时才答应持续匹配
-
Repeat 指定次数的匹配
其间可输入的常用参数有:
-
.any 与任何元素匹配的字符类
-
.anyNonNewline 与任何非换行符元素匹配的字符类
-
.digit 任意数字
-
.hexDigit 任何十六进制数字
-
.word 任何单词字符
-
.whitespace 任何空格字符
其他内容我们能够自行探究一下。
这儿每天分享一个 iOS 的新知识,快来重视我吧
本文同步自微信公众号 “iOS新知”,每天准时分享一个新知识,这儿仅仅同步,想要及时学到就来重视我吧!