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