为什么某些正则表达式命令具有各种字符的相反的'\'解释?


10

以以下命令为例:

find . -regex ".*\.\(cpp\|h\)"

这将在目录中找到所有的.h和.cpp文件。句号“。” 在正则表达式中通常表示“任何字符”。要使其仅与实际期间匹配,必须使用反斜杠字符“ \”对其进行转义。

在这种情况下,给定具有特殊含义的字符,您必须对其进行转义以获取其代表的实际字符。

现在,带括号和“或”栏,分别为字符“(”,“)”和“ |”。这些也具有特殊含义,用于对正则表达式进行分组。但是,要获得特殊含义,必须使用反斜杠对字符进行转义!没有反斜杠,字符具有它所代表的实际字符的含义。

为什么是“。” 与'(',')'和'|'不同吗?

Answers:


12

答案确实是“只是因为”。有很多不同的正则表达式语法,尽管它们具有相似的外观,并且通常基础知识是相同的,但在细节方面有所不同。

从历史上看,每个工具都有自己的新实现,可以尽作者的最大努力。在使字符有特殊字符和无特殊字符之间有一个平衡-太多的“天生特殊字符”,您最终不得不一直逃避它们以匹配它们。或者,相反,您最终需要大量转义才能使用常见的正则表达式语法,例如()分组。每个编写程序的人都根据程序所匹配的需求,认为正确的方法以及月球的相位来决定如何执行。

POSIX尝试进行标准化,它定义了“ 基本正则表达式 ”和“ 扩展正则表达式 ”。赫然,彼此问候这些工作向后\- 有时,但不是完美的一致性。

Perl正则表达式已成为另一个事实上的标准,其原因有两个:首先,它们非常灵活和强大,其次,它们实际上非常神智,约定如“ \总是转义非字母数字字符”。

GNU Find有一个-regextype选项,您可以在其中更改所使用的正则表达式语法。可悲的是,至少在我拥有的find版本中,“ perl”不是一个选项。(毫不奇怪,GNU的默认名称是“ emacs”,该语法在此处记录。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.