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

时间:2016-02-05 12:07:32

标签: python regex escaping string-literals unicode-escapes

在许多语言中,对转义序列的支持与字符串文字与正则表达式不同。例如,在python中,\s转义序列在正则表达式中找到而不是作为字符串文字,而在php中,\f表单订阅源转义序列在正则表达式中找到而不是作为字符串文字。虽然我理解显而易见的(\s表示多个字符并会引起歧义),但有些例子并不那么明确。除了一切之外,这些背后的文档也经常被忽略。

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

由于我是编程的新手,我担心我遗漏了一些关键信息/背后的历史。我的担忧是否合理?这甚至是个问题吗?其他人都知道我不知道的事吗?

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

1 个答案:

答案 0 :(得分:2)

在字符串文字中找到的转义序列可以阻止编程语言混淆。例如,在许多语言中,字符串文字表示为引号之间的字符,如此

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

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