正则表达式 (V2 开发中) Swift 版本 平台 构建状态 Codebeat 状态 Codecov

一个使用纯 Swift 实现的正则表达式引擎

再次尝试 V2 版本,使用 DFA (确定有限状态自动机) 代替 NFA (非确定有限状态自动机) 以获得类似 grep 的性能

用法

为了避免编译开销,可以创建一个 Regex 实例

// Compile the expression
let regex = try! Regex(pattern: "[a-zA-Z]+")

let string = "RegEx is tough, but useful."

// Search for matches
let words = regex.match(string)

/*
words = [
	RegexMatch(match: "RegEx", groups: []),
	RegexMatch(match: "is", groups: []),
	RegexMatch(match: "tough", groups: []),
	RegexMatch(match: "but", groups: []),
	RegexMatch(match: "useful", groups: []),
]
*/

如果编译开销不是问题,可以使用 =~ 运算符来匹配字符串

let fourLetterWords = "drink beer, it's very nice!" =~ "\\b\\w{4}\\b" ?? []

/*
fourLetterWords = [
	RegexMatch(match: "beer", groups: []),
	RegexMatch(match: "very", groups: []),
	RegexMatch(match: "nice", groups: []),
]
*/

默认情况下,Global 标志处于激活状态。 要更改哪些标志处于激活状态,请在模式的开头添加 /,并在末尾添加 /<flags>。 可用标志如下

// Global and Case Insensitive search
let regex = try! Regex(pattern: "/\\w+/ig")

支持的操作

字符类

模式 描述 支持
. [^\n\r]
[^] [\s\S]
\w [A-Za-z0-9_]
\W [^A-Za-z0-9_]
\d [0-9]
\D [^0-9]
\s [\ \r\n\t\v\f]
\S [^\ \r\n\t\v\f]
[ABC] 集合中的任何一个字符
[^ABC] 不在集合中的任何字符
[A-Z] 范围内的任何字符 (包含边界)

锚点 (匹配位置而不是字符)

模式 描述 支持
^ 字符串的开头
$ 字符串的结尾
\b 单词边界
\B 非单词边界

转义字符

模式 描述 支持
\0 八进制转义字符
\00 八进制转义字符
\000 八进制转义字符
\xFF 十六进制转义字符
\uFFFF Unicode 转义字符
\cA 控制字符
\t 制表符
\n 换行符
\v 垂直制表符
\f 换页符
\r 回车符
\0 \0
\. .
\\ \
\+ +
\* *
\? ?
\^ ^
\$ $
\{ {
\} }
\[ [
\] ]
\( (
\) )
\/ /
| ` `

空字符

模式 描述 支持
分组和环视 (ABC)
捕获组 (<name>ABC)
\1 命名捕获组
\k<name> 命名反向引用
(?:ABC) 非捕获组
(?=ABC) 正向先行断言
(?!ABC) 负向先行断言
(?<=ABC) 正向后行断言
(?<!ABC) 负向后行断言

贪婪量词

模式 描述 支持
+ 一个或多个
* 零个或多个
? 可选
{n} n 个
{,} * 相同
{,n} n 个或更少
{n,} n 个或更多
{n,m} n 到 m 个

懒惰量词

模式 描述 支持
+? 一个或多个
*? 零个或多个
?? 可选
{n}? n 个
{,n}? n 个或更少
{n,}? n 个或更多
{n,m}? n 到 m 个

选择

模式 描述 支持
| 匹配之前的所有内容或者之后的所有内容

标志

模式 描述 支持
i 大小写不敏感
g 全局
m 多行

内部工作原理

(类似于之前)


注意

Swift 将 \r\n 视为单个 Character。 使用 \n\r 来同时拥有两者。

资源