我有一个带有空值的文本源,我需要将它们与我的正则表达式模式一起拉出来。正则表达式甚至可以匹配空字符吗?
当我的模式拒绝匹配时,我才意识到我拥有它们,当我将它粘贴到Notepad ++中时,它显示了所有空字符。
答案 0 :(得分:43)
\x00
这是一个空字符。
答案 1 :(得分:2)
匹配空字符的一个问题是您首先需要安排让它到达。许多语言使用以null结尾的字符串,因此您的匹配可能不会与整个输入相对。
至于如何在PCRE中表达它,\ 000起作用并且不会被其后的任何东西绊倒,就像\ x {}一样(但是在我看来,八进制版本在浏览正则表达式时更容易识别)。
有关如何以各种不同方式指定null的完整详细信息,请参阅the PCRE manpages并搜索非打印字符。
答案 2 :(得分:2)
澄清/添加前一个答案的另一个细节:PCRE库接受模式为" C"以空字符结尾的字符串。 (引用PCRE文档:"模式是由二进制零"终止的C字符串。)这意味着模式不能包含文字NUL字符 - 相反,它必须始终使用其他答案中描述的方法进行转义。 ("与模式字符串不同,主题可能包含 二进制零。" " 4.虽然主题字符串支持二进制零字符, 它们不允许出现在模式字符串中,因为它是作为一个 mal C字符串,以零结尾。可以使用转义序列\ 0 用于表示二进制零的模式。")
NUL字符是PCRE模式中唯一必须转义的字符,其他所有字符都可以字面化:"对此没有任何限制 非打印字符的外观,除了二进制零之外 终止模式"。
作为最后的比较注释,其他一些Perl兼容的正则表达式引擎确实允许文字NUL采用模式,例如Python的SRE。例如。来自Python3的urlib.parse有以下行:_asciire = re.compile('([\x00-\x7f]+)')
。注意缺少" r"表示原始文字 - 这意味着这里的unescaping发生在Python级别上,re模块获取模式中值为0x00和0x7f的字符。