在编程中,为什么正则表达式的转义序列和字符串文字的转义序列不同?

In programming, why are escape sequences for regex and escape sequences for string literals different?

在许多语言中,对转义序列的支持不同于字符串文字和正则表达式。例如,在 python 中,\s 转义序列在正则表达式中找到,但不是字符串文字,而在 php 中,\f 表单提要转义序列在正则表达式中找到,而不是作为字符串文字。虽然我理解显而易见的(\s 代表多个字符并且会引入歧义)但有一些例子并不那么清楚。最重要的是,这些背后的文档也经常被忽视。

PHP 例如,有一个专用于 PCRE 转义序列的页面,http://php.net/manual/en/regexp.reference.escape.php,但未能提供字符串文字中转义序列的官方排他列表。

由于我是编程菜鸟,我担心我遗漏了这背后的一些关键information/history。我的担心有道理吗?这甚至是一个问题吗?其他人是否知道我不知道的事情?

(图片相关)一个非官方的,甚至不知道它是否正确,列表 php 字符串文字转义序列。为什么语言不在正则表达式和字符串文字之间进行标准化?为什么我似乎无法在这两个截然不同的事物之间找到好的文档

在字符串文字中发现的转义序列是为了防止编程语言变得混乱。例如,在许多语言中,字符串文字表示为引号之间的字符,如

my_string = 'x string'

但是如果您的字符串包含引号字符,那么您需要一种方法来告诉编程语言这应该被解释为文字字符

my_string = 'x's string' # this will cause bugs
my_string = 'x\'s string' # lets the programing language know that the internal quote is literal and not the end of the string

我认为大多数编程语言都有相同的字符串文字转义序列集。

正则表达式是另一回事,您可以将它们视为自己独立的语言,以字符串文字形式编写。在正则表达式中,一些字符如句点 (.) 具有特殊含义,必须转义以匹配其文字对应物。而其他字符,如果前面有反斜杠,则这些字符具有特殊含义。

例如

regex_string = 'A.C'  # match an A, followed by any character, followed by C
regex_string = 'A\.C' # match an A, followed by a period, followed by C
regex_string = 'AsC'  # match an A, followed by s, followed by C
regex_string = 'A\sC'  # match an A, followed by a space character, followed by C

因为正则表达式是它们自己的迷你语言,所以正则表达式中的所有转义序列都可用于普通字符串文字是没有意义的。