9个版本

0.3.0 2023年2月12日
0.2.3 2022年3月8日
0.2.2 2022年1月21日
0.2.1 2021年12月27日
0.1.3 2021年10月31日

#438 in 文本处理

每月 44 次下载
用于 3 个crates (直接使用2个)

MIT/Apache

46KB
493

Github CI Crates.io docs.rs

人类正则表达式

这个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] 对称差(仅匹配ah)。需要 .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(忽略空白字符并允许行注释,以#开头)
  1. 由于该库的声明性,使用此标志只会模糊其含义。
  2. 当使用human_regex时,应在源代码中添加注释,而不是在正则表达式字符串中。

依赖关系

~2.2–3MB
~53K SLoC