我想知道是否存在不是字符串的顺序数据的正则表达式。
我知道正则表达式基本上归结为DFA,但我对更高级语言更感兴趣来指定这些DFA。
答案 0 :(得分:3)
你可以争辩说,语法是一种正则表达形式,适用于比字符串更复杂的事物。原则上,您可以在其他标记上设计正则表达式而不仅仅是字符。作为一种选择,您可以争辩说Unicode的正则表达式就是这样一种生物 - 它肯定不像经典正则表达式那样匹配简单字节。
答案 1 :(得分:3)
即使“atoms”不是字符,也可以使用普通的无上下文解析器生成器(如Yacc / Bison)生成常规语言解析器。通过挂钩扫描程序功能,您可以使语法解析“任何东西”,无论它是否是字符串。
另一件事是在逻辑领域,存在“时间逻辑”,例如LTL和CTL,它们基本上是“事件”的正则表达式的子集。 LTL中的逻辑公式通常被转换为有限状态自动机。
答案 2 :(得分:3)
正则表达式理论中绝对没有任何东西可以阻止它们应用于除了字符串之外的其他东西。只是大多数正则表达式引擎实现都不允许这样做。
但是,如果你有一个正则表达式引擎,它允许你将字符串视为未编码的8位数据(有时称为BINARY
,8BIT
或ASCII-8BIT
),那么您可以使用该引擎来解析面向字节的二进制数据。
Ragel是一个状态机编译器,专门用于解析二进制协议。您可以在高级(类似regexp)的DSL中编写状态机,然后Ragel将其编译为目标语言--Ragel目前支持C,C ++,Objective-C,D,Java和Ruby。
大多数函数式编程语言都具有强大的模式匹配功能,直接融入语言本身。这些工具可用于模式匹配二进制数据。其中一个例子是Erlang对building and pattern matching binary data structures的支持。
OMeta是一种模式匹配和模式转换语言,基本上是类固醇上正则表达式的超集。它不仅支持匹配字符串,还支持数组和整数和任意对象列表的匹配。