PCRE正则表达式能匹配空字符吗?

33

我有一个包含空值的文本源,我需要将其与我的正则表达式模式一起提取出来。正则表达式能匹配空字符吗?

当我尝试使用我的正则表达式模式匹配时,我才意识到它们存在。当我将文本粘贴到Notepad++中时,它显示了所有的空字符。

3个回答

60
\x00

那是一个空字符。


谢谢。工作得很好,但是我无法让任何我的“可视化”工具与空值一起使用,但是Regex Buddy的Grep可以在后台完成它。 - Keng
除非你只想匹配\x0,否则不应该这样做。如果你试图匹配\x0apple,那么它将尝试匹配\npple - Jonathan

2

在匹配空字符时存在一个问题,您首先需要安排好它的到达。许多语言使用以null结尾的字符串,因此您的匹配可能不是针对整个输入的。

至于如何在PCRE中表达它,\000是有效的,并且不会被其后的任何内容所干扰,而\x{}就会被干扰(但在我的意见中,八进制版本更容易在浏览正则表达式时识别)。

请参见PCRE手册,搜索非打印字符以获取有关以各种不同方式指定空值的完整详细信息。


2
为了澄清/补充之前的回答:PCRE库接受模式作为“C”零终止字符串。(引用PCRE文档:“模式是由二进制零终止的C字符串。”)这意味着模式不能包含文字NUL字符 - 相反,它必须始终使用其他答案中描述的方法进行转义。(“与模式字符串不同,主题可能包含二进制零。”“4. 虽然主题字符串支持二进制零字符, 但在模式字符串中不允许使用它们,因为它被传递为一个普通的C字符串,以零结尾。转义序列\0可以在模式中用于表示二进制零。”)
NUL字符是PCRE模式中唯一必须转义的字符,所有其他字符都可以直接使用:“除了终止模式的二进制零外,没有对非打印字符的出现做出限制。”
作为最后的比较说明,其他一些Perl兼容的正则表达式引擎确实允许在模式中使用文字NUL,例如Python的SRE。例如,Python3的urlib.parse有以下行:_asciire = re.compile('([\x00-\x7f]+)')。请注意缺少“r”表示原始字面量 - 这意味着在Python级别上进行了取消转义,在模块中获取了值为0x00和0x7f的字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接