let pattern = #"(\d+)"# let regex = try Regex(pattern)这种创建方式和 NSRegularExpression 差不多,首先,你还是需要将特殊符号用反斜杠标记,其次,你需要使用 try 来捕获异常情况。为了避免上述情况,swift 出了一种使用两个斜杠"/.../"来直接生成 Regex 的方法,以上代码等同于:
let regex1 = /(\d+)/这种通过正则语法糖的方式生成正则表达式时,可以在编译器检查是否有语法错误,还有 Xcode 语法突出显示。使用这个表达式可以检测字符串中的名称和数字:
let regex = /(\w+)\s+(\d+)/ let input = "Tom 123 xyz" if let result = input.firstMatch(of: regex) { print(result.0) // Tom 123 print(result.1) // Tom print(result.2) // 123 }输出的结果是一个元组,第一个值正则表达式匹配的所有内容,第二个值是捕获的第一个子字符串,第三个值是捕获的第二个子字符串,以此类推。
let regex = /(\w+)\s+(\d+)/ let input = "Tom 123 xyz" if let (matched, name, count) = input.firstMatch(of: regex)?.output { print(matched) // Tom 123 print(name) // Tom print(count) // 123 }我们还可以在正则表达式里直接命名捕获的变量:
let input = "Tom 123 xyz" let regex = /(?<name>\w+)\s+(?<count>\d+)/ if let match = input.firstMatch(of: regex) { print(match.name) // Tom print(match.count) // 123 }不同的匹配方式
// 首个匹配 input.firstMatch(of: regex) // 完整匹配 input.wholeMatch(of: regex) // 前缀匹配 input.prefixMatch(of: regex) let line = "Tom 1234" // 将空格替换成逗号 let line1 = line.replacing(/\s+/,with:",") // Tom,1234 // 去除字母和空格 let line2 = line.trimmingPrefix(/\w+\s+/) // 1234 // 使用空格拆分 let fields = line.split(separator: /\s+/) // ["Tom","1234"]正则表达式生成器
import RegexBuilder然后构建正则表达式:
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 之外,还有很多可用的语法表达式,以下是一些常用的:
Repeat 指定次数的匹配