【问题标题】:Can PCRE regex match a null character?PCRE 正则表达式可以匹配空字符吗?
【发布时间】:2011-02-04 13:54:57
【问题描述】:

我有一个包含空值的文本源,我需要将它们与我的正则表达式模式一起拉出。正则表达式甚至可以匹配空字符吗?

当我的模式拒绝匹配时,我才意识到我有它们,当我将它粘贴到 Notepad++ 中时,它显示了所有空字符。

【问题讨论】:

    标签: regex null pcre


    【解决方案1】:
    \x00
    

    这是一个空字符。

    【讨论】:

    • 谢谢。效果很好,但无法让我的任何“视觉”工具与 null 一起使用,但 Regex Buddy 的 Grep 会在幕后完成。
    • 不应该做\x0,除非那是你唯一匹配的东西。如果您尝试匹配\x0apple,那将尝试匹配\npple
    【解决方案2】:

    澄清/添加另一个细节到先前的答案:PCRE 库接受模式作为“C”以 nul 结尾的字符串。 (引用 PCRE 文档:“模式是由二进制零终止的 C 字符串”。)这意味着模式不能包含文字 NUL 字符 - 相反,它必须始终使用其他答案中描述的方法进行转义。 ("与模式字符串不同,主题可能包含 二进制零。" " 4. 虽然主题字符串中支持二进制零字符,但 它们在模式字符串中是不允许的,因为它是作为标准传递的 mal C 字符串,以零结尾。转义序列 \0 可用于 表示二进制零的模式。")

    NUL 字符是 PCRE 模式中唯一必须转义的字符,所有其他字符都可以转义:“没有限制 非打印字符的外观,除了二进制零 终止一个模式”。

    作为最后的比较说明,其他一些与 Perl 兼容的正则表达式引擎确实允许在模式中使用文字 NUL,例如 Python 的 SRE。例如。来自 Python3 的 urlib.parse 具有以下行:_asciire = re.compile('([\x00-\x7f]+)')。请注意缺少“r”来表示原始文字 - 这意味着此处的转义发生在 Python 级别,并且 re 模块获取模式中值为 0x00 和 0x7f 的字符。

    【讨论】:

      【解决方案3】:

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

      至于如何在 PCRE 中表达它,\000 有效,并且不会被它后面的任何东西绊倒,就像 \x{} 一样(但我认为八进制版本在浏览正则表达式时更容易识别)。

      请参阅the PCRE manpages 并搜索非打印字符,了解如何以各种不同方式指定空值的完整详细信息。

      【讨论】:

        猜你喜欢
        • 2017-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 2018-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多