4 个版本 (破坏性更新)
0.4.4 | 2022年8月24日 |
---|---|
0.4.3 |
|
0.3.0 | 2022年3月29日 |
0.2.0 | 2022年3月11日 |
0.1.0 | 2022年3月11日 |
#28 在 #expression-language
每月 37 次下载
用于 2 个crate
250KB
5K SLoC
示例
左侧是 rulex 表达式(简称 rulexes),右侧是编译后的正则表达式
# String
'hello world' # hello world
# Greedy repetition
'hello'{1,5} # (?:hello){1,5}
'hello'* # (?:hello)*
'hello'+ # (?:hello)+
# Lazy repetition
'hello'{1,5} lazy # (?:hello){1,5}?
'hello'* lazy # (?:hello)*?
'hello'+ lazy # (?:hello)+?
# Alternation
'hello' | 'world' # hello|world
# Character classes
['aeiou'] # [aeiou]
['p'-'s'] # [p-s]
# Named character classes
[.] [w] [s] [n] # .\w\s\n
# Combined
[w 'a' 't'-'z' U+15] # [\wat-z\x15]
# Negated character classes
!['a' 't'-'z'] # [^at-z]
# Unicode
[Greek] U+30F Grapheme # \p{Greek}\u030F\X
# Boundaries
<% %> # ^$
% 'hello' !% # \bhello\B
# Non-capturing groups
'terri' ('fic' | 'ble') # terri(?:fic|ble)
# Capturing groups
:('test') # (test)
:name('test') # (?P<name>test)
# Lookahead/lookbehind
>> 'foo' | 'bar' # (?=foo|bar)
<< 'foo' | 'bar' # (?<=foo|bar)
!>> 'foo' | 'bar' # (?!foo|bar)
!<< 'foo' | 'bar' # (?<!foo|bar)
# Backreferences
:('test') ::1 # (test)\1
:name('test') ::name # (?P<name>test)\1
# Ranges
range '0'-'999' # 0|[1-9][0-9]{0,2}
range '0'-'255' # 0|1[0-9]{0,2}|2(?:[0-4][0-9]?|5[0-5]?|[6-9])?|[3-9][0-9]?
变量
let operator = '+' | '-' | '*' | '/';
let number = '-'? [digit]+;
number (operator number)*
用法
阅读 此书 以开始使用,或查看 CLI 程序、Rust 库 和 过程宏。
为什么使用这个而不是常规正则表达式?
常规正则表达式非常简洁,但当它们变长时,理解起来变得越来越困难。默认情况下,它们没有注释,且空白字符很重要。然后是各种符号和转义符,它们遵循没有可识别的系统:(?<=) (?P<>) .?? \N \p{} \k<> \g''
等等。由于各种正则表达式实现之间的不一致,这完美地导致了混乱。
Rulex 使用一种新、更简单但更强大的语法来解决这些问题
- 它不区分空白字符,并允许注释
- 文本必须出现在引号内。这使表达式变长,但阅读起来更容易
- 非捕获组是默认的
- 更直观、一致的语法
- 变量使表达式更简洁
兼容性
Rulex 目前与 PCRE、JavaScript、Java、.NET、Python、Ruby 和 Rust 兼容。必须在编译时指定正则表达式风味,以便 rulex 可以确保生成的正则表达式在目标正则表达式引擎上按预期工作。
JavaScript用户重要提示:不要忘记启用u
标志。这是支持Unicode所必需的。所有其他主要的正则表达式引擎默认都支持Unicode。
诊断
Rulex寻找错误并显示有用的诊断信息
- 如果您使用了目标正则表达式引擎不支持的功能,则会显示错误
- 它会检测语法错误,并显示如何解决这些错误的建议
- 它会解析反斜杠转义字符(在rulex中不允许使用)并解释应如何编写替代内容
- 它会寻找可能出现的错误并显示警告
- 它会寻找对某些输入可能非常慢且容易受到拒绝服务攻击的模式(即将推出)
路线图
贡献
您可以通过使用rulex并提供反馈来做出贡献。如果您发现了一个错误或有任何疑问,请创建一个issue。
我也很高兴接受代码贡献。为了确保CI成功,请在创建pull request之前运行cargo fmt
、cargo clippy
和cargo test
。
许可
双许可协议,许可协议为MIT许可或Apache 2.0许可。
依赖
~1.2–2MB
~39K SLoC