我想知道为什么会有这么多正则表达式方言。为什么看起来很多编程语言不是采用一种经过验证的方言,而是坚持自己写。
我的意思是,我明白其中一些确实有非常不同的后端。但这不应该被程序员抽象出来吗?
我更关注的是奇怪但微小的差异,例如在一种语言中括号必须被转义,而在另一种语言中则是字面值。或者特殊字符的含义有所不同。
是否有任何特殊原因我们不能拥有某种通用的正则表达式方言?我认为这会让那些需要在多种编程语言中工作的程序员更容易。
我想知道为什么会有这么多正则表达式方言。为什么看起来很多编程语言不是采用一种经过验证的方言,而是坚持自己写。
我的意思是,我明白其中一些确实有非常不同的后端。但这不应该被程序员抽象出来吗?
我更关注的是奇怪但微小的差异,例如在一种语言中括号必须被转义,而在另一种语言中则是字面值。或者特殊字符的含义有所不同。
是否有任何特殊原因我们不能拥有某种通用的正则表达式方言?我认为这会让那些需要在多种编程语言中工作的程序员更容易。
因为正则表达式只有三种操作:
|
*
其它所有的都是扩展或语法糖,没有标准化的来源。像捕获组、向后引用、字符类、基数操作等都是对正则表达式原始定义的补充。
其中一些扩展使得“正则表达式”不再是正则的。由于这些额外的功能,它们能够决定非正则语言,但我们仍然称它们为正则表达式。
随着人们添加更多扩展,他们通常会尝试使用其他常见的正则表达式变体。这就是为什么几乎每个方言都使用X+
来表示“一个或多个X”,这本身只是写XX*
的快捷方式。
但是当添加新功能时,没有标准化的依据,所以某人必须想出一些东西。如果有多个设计者团队在大约同一时间想出了类似的想法,则它们将具有不同的方言。
sed
在进化过程中陷入了一种奇怪的境地,因为 POSIX 只为其指定了 BRE 语义(虽然事实上大多数 sed
实现也支持使用 -E
或 -r
来支持 ERE,并且一些实现还支持 Perl 的简写形式,如 \s
和 \d
)。 - tripleee我认为其中一个重要问题是谁将负责设置和维护标准语法,并确保在不同环境下的兼容性。
此外,如果正则表达式必须在其自己独特的字符串操作规则解析器/编译器内进行解析,则这可能会导致在转义和字面上做出不同的事情。
一个好的策略是花时间了解正则表达式算法本身在更抽象的层次上如何工作;然后实现任何特定的语法会变得更加容易。类似于每种编程语言都有其自己的构造条件语句和循环的语法,但仍然完成相同的抽象任务。