Rulex - 一种新的、可移植的、正则表达式语言

444 阅读3分钟

rulex

一种新的、可移植的、正则表达式语言

阅读 本书 即可开始使用!

例子

左边是rulex表达式*(简称rulex*),右边是编译后的regex。

# 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库程序宏

为什么使用这个而不是普通的regexes?

普通的regexes非常简洁,但是当它们变长时,就会变得越来越难理解。默认情况下,它们没有注释,而空白是重要的。然后是大量的符号和反斜杠转义,它们不遵循任何可识别的系统:(?<=) (?P<>) .?? \N \p{} \k<> \g'' ,等等。而且,在不同的Rgex实现之间存在着各种不一致,这是造成混乱的完美秘诀。

Rulex用一种新的、更简单但也更强大的语法解决了这些问题。

  • 它对空格不敏感,并允许注释
  • 文本必须出现在引号中。这使得表达式更长,但也更容易阅读
  • 非抓取组是默认的
  • 更加直观、一致的语法
  • 变量使表达式更简洁

兼容性

Rulex目前与PCRE、JavaScript、Java、.NET、Python、Ruby和Rust兼容。在编译过程中,必须要指定搜索结果,所以rulex可以确保产生的搜索结果在目标搜索引擎上能正常工作。

对JavaScript用户的重要提示。不要忘记启用u 标志。这是支持Unicode的必要条件。所有其他主要的铰链引擎都默认支持Unicode。

诊断功能

Rulex寻找错误并显示有用的诊断。

  • 如果你使用了目标词组不支持的功能,它会显示一个错误。
  • 它检测语法错误并显示如何解决它们的建议
  • 它解析反斜线转义(在Rulex中不允许),并解释应该怎么写。
  • 它寻找可能的错误并显示警告
  • 它寻找对某些输入非常慢的模式,并且容易受到拒绝服务攻击*(即将推出)*。

路线图

你可以在这里找到路线图。

贡献

你可以通过使用rulex和提供反馈作出贡献。如果你发现一个错误或有一个问题,请创建一个问题。

我也很乐意接受代码贡献。为了确保CI的成功,请在创建拉动请求之前运行cargo fmt,cargo clippycargo test

许可证

MIT许可Apache 2.0许可下的双重许可。