#regex #语法 #表达式语言 #解析器

已弃用 rulex

已弃用:请使用 pomsky。一种新的正则表达式语言

4 个版本 (破坏性更新)

0.4.4 2022年8月24日
0.4.3 2022年6月19日
0.3.0 2022年3月29日
0.2.0 2022年3月11日
0.1.0 2022年3月11日

#28#expression-language

每月 37 次下载
用于 2 个crate

MIT/Apache

250KB
5K SLoC

Crown in double quotes logo

rulex

⚠️ 已弃用 ⚠️ 请使用 pomsky crate。Rulex 已更名为 pomsky。

一种新的、可移植的正则表达式语言。阅读 此书 以开始使用!

示例

左侧是 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 fmtcargo clippycargo test

许可

双许可协议,许可协议为MIT许可Apache 2.0许可

依赖

~1.2–2MB
~39K SLoC