人类正则表达式
这个crate的目标很简单:让每个人都能使用正则表达式,而不必学习复杂的语法。它受到了ReadableRegex.jl的启发。这个crate是Rust核心正则表达式库的包装。
示例用法
如果您想匹配格式为2021-10-30
的日期,您可以使用以下代码生成正则表达式
use human_regex::{beginning, digit, exactly, text, end};
let regex_string = beginning()
+ exactly(4, digit())
+ text("-")
+ exactly(2, digit())
+ text("-")
+ exactly(2, digit())
+ end();
assert!(regex_string.to_regex().is_match("2014-01-01"));
to_regex()
方法返回一个标准Rust正则表达式。我们可以用稍微少一些重复的方式来做到这一点!
use human_regex::{beginning, digit, exactly, text, end};
let first_regex_string = text("-") + exactly(2, digit());
let second_regex_string = beginning()
+ exactly(4, digit())
+ exactly(2, first_regex_string)
+ end();
assert!(second_regex_string.to_regex().is_match("2014-01-01"));
有关更全面的示例,请参阅食谱。
特性
此crate通过可读性API支持Rust核心正则表达式库中的大多数语法。
单个字符
实现了? |
表达式 |
描述 |
any() |
. |
任何字符,除了换行符(包括带有s标志的换行符) |
digit() |
\d |
数字 (\p{Nd} ) |
non_digit() |
\D |
非数字 |
unicode_category(UnicodeCategory) |
\p{L} |
Unicode非脚本类别 |
unicode_script(UnicodeScript) |
\p{Greek} |
Unicode脚本类别 |
non_unicode_category(UnicodeCategory) |
\P{L} |
否定单字母Unicode字符类名称 |
non_unicode_script(UnicodeCategory) |
\P{Greek} |
否定Unicode字符类(通用类别或脚本) |
字符类
实现了? |
表达式 |
描述 |
或(&['x', 'y', 'z']) |
[xyz] |
A character class matching either x, y or z (union). |
nor(&['x', 'y', 'z']) |
[^xyz] |
A character class matching any character except x, y and z. |
within('a'..='z') |
[a-z] |
A character class matching any character in range a-z. |
without('a'..='z') |
[^a-z] |
匹配除a-z之外的任意字符的字符类别。 |
见下文 |
[[:alpha:]] |
ASCII字符类别([A-Za-z] ) |
非字母数字() |
[[:^alpha:]] |
否定ASCII字符类别([^A-Za-z] ) |
或() |
[x[^xyz]] |
嵌套/分组字符类别(匹配除y和z之外的任意字符) |
and(&[]) /& |
[a-y&&xyz] |
交集(a-y AND xyz = xy) |
(或[1,2,3,4] & nor(3)) |
[0-9&&[^4]] |
使用交集和否定进行减法(匹配0-9除4之外) |
subtract(&[],&[]) |
[0-9--4] |
直接减法(匹配0-9除4之外)。使用 .collect::<Vec> 来使用范围。 |
xor(&[],&[]) |
[a-g~~b-h] |
对称差(仅匹配a 和h )。需要 .collect() 来处理范围。 |
或(&escape_all(&['[',']'])) |
[\[\]] |
字符类别中的转义(匹配[ 或] ) |
Perl字符类别
实现了? |
表达式 |
描述 |
digit() |
\d |
数字 (\p{Nd} ) |
non_digit() |
\D |
非数字 |
空白字符() |
\s |
空白字符(\p{White_Space} ) |
非空白字符() |
\S |
非空白字符 |
单词() |
\w |
单词字符(\p{Alphabetic} + \p{M} + \d + \p{Pc} + \p{Join_Control} ) |
非单词() |
\W |
非单词字符 |
ASCII字符类别
实现了? |
表达式 |
描述 |
字母数字() |
[[:alnum:]] |
字母数字([0-9A-Za-z] ) |
字母() |
[[:alpha:]] |
字母([A-Za-z] ) |
ASCII() |
[[:ASCII:]] |
ASCII([\x00-\x7F] ) |
空白字符() |
[[:空白字符:]] |
空白字符([\t ] ) |
控制字符() |
[[:cntrl:]] |
控制字符([\x00-\x1F\x7F] ) |
digit() |
[[:digit:]] |
数字([0-9] ) |
图形字符() |
[[:graph:]] |
图形字符([!-~] ) |
大写字母() |
[[:小写:]] |
小写字母([a-z] ) |
可打印字符() |
[[:print:]] |
可打印字符([ -~] ) |
标点符号() |
[[:punct:]] |
标点符号(代码:[!-/-:-@\[-`{-~] ) |
空白字符() |
[[:空格:]] |
空白字符(代码:[\t\n\v\f\r ] ) |
小写字母() |
[[:大写:]] |
大写字母(代码:[A-Z] ) |
单词() |
[[:单词:]] |
单词字符(代码:[0-9A-Za-z_] ) |
十六进制数字() |
[[:xdigit:]] |
十六进制数字(代码:[0-9A-Fa-f] ) |
重复
实现了? |
表达式 |
描述 |
零个或多个(x) |
x* |
零个或多个x(贪婪) |
一个或多个(x) |
x+ |
一个或多个x(贪婪) |
零个或一个(x) |
x? |
零个或一个x(贪婪) |
零个或多个(x) |
x*? |
零个或多个x(非贪婪/懒惰) |
一个或多个(x).懒惰() |
x+? |
一个或多个x(非贪婪/懒惰) |
零个或多个(x).懒惰() |
x?? |
零个或一个x(非贪婪/懒惰) |
范围(n,m,x) |
x{n,m} |
至少n个x和最多m个x(贪婪) |
至少(n,x) |
x{n,} |
至少n个x(贪婪) |
确切(n,x) |
x{n} |
确切n个x |
范围(n,m,x).懒惰() |
x{n,m}? |
至少n个x和最多m个x(非贪婪/懒惰) |
至少(n,x).懒惰() |
x{n,}? |
至少n个x(非贪婪/懒惰) |
组合
实现了? |
表达式 |
描述 |
+ |
xy |
连接(x后面跟随y) |
或() |
x|y |
交替(x或y,优先x) |
空匹配
实现了? |
表达式 |
描述 |
开始() |
^ |
文本的开始(或多行模式下的行首) |
结束() |
$ |
文本的结束(或多行模式下的行尾) |
beginning_of_text() |
\A |
仅文本的开始(即使多行模式已启用) |
end_of_text() |
\z |
仅文本的结束(即使多行模式已启用) |
word_boundary() |
\b |
Unicode单词边界(\w在一侧,\W、\A或\z在另一侧) |
non_word_boundary() |
\B |
非Unicode单词边界 |
分组
实现了? |
表达式 |
描述 |
捕获(exp) |
(exp) |
编号捕获组(由括号索引) |
named_capture(exp,name) |
(?P<name>exp) |
命名(也是编号)捕获组 |
通过函数组合隐式处理 |
(?:exp) |
non-capturing group |
见下文 |
(?flags) |
在当前组内设置标志 |
见下文 |
(?flags:exp) |
为exp(非捕获)设置标志 |
Flags
实现了? |
表达式 |
描述 |
case_insensitive(exp) |
i |
不区分大小写:字母匹配大小写 |
multi_line_mode(exp) |
m |
多行模式:^和$匹配行首和行尾 |
dot_matches_newline_too(exp) |
s |
允许.匹配\n |
将不会实现1 |
U |
交换x*和x*?的含义 |
disable_unicode(exp) |
u |
Unicode支持(默认启用) |
将不会实现2 |
x |
ignore_whitespace_and_allow_line_comments(忽略空白字符并允许行注释,以#开头) |
- 由于该库的声明性,使用此标志只会模糊其含义。
- 当使用
human_regex
时,应在源代码中添加注释,而不是在正则表达式字符串中。