【问题标题】:Can XQuery regex match a null character?XQuery 正则表达式可以匹配空字符吗?
【发布时间】:2017-10-04 18:53:20
【问题描述】:

我想从字符串中删除所有 NULL 字符。我知道正确的正则表达式匹配应该是 \x00 并且我尝试了以下 XQuery:

replace($message, '\x00', '')

导致错误:

exerr:ERROR Conversion from XPath2 to Java regular expression syntax failed: Error at character 1 in regular expression \x00: invalid escape sequence

是否有任何快速解决方案或解决方法可以解决此问题?我使用 eXist-db 2.2。

【问题讨论】:

    标签: regex xml xquery exist-db


    【解决方案1】:

    简短版本:您不能,至少不能在 XQuery 和 XML 规范的范围内。可能有一个我不知道的 eXist-DB 专有方法(类似于 nativly 接口来自 XQuery 的 Java 正则表达式函数,seems to be possible in eXist DB),但我不认为这是一个“快速解决方案或解决方法”。

    查看XPath and XQuery Functions and Operators 3.0 specification which also contains the definition of regular expressions for XQuery 3.0,没有指定的方法可以通过它们的 unicode 代码点来转义字符。 \x00 语法特定于某些正则表达式实现。 regular-expressions.info verifies this assumption:

    XML 正则表达式没有像 \xFF\uFFFF 这样的标记来匹配特定(不可打印)字符。您必须将它们作为文字字符添加到您的正则表达式中。如果您使用纯文本编辑器将正则表达式输入 XML 文件,则可以使用  XML 语法。否则,您需要从字符映射中粘贴字符。

    考虑到这一点,可能有两种选择:

    1. 使用 XML 实体来表示空字节。这也是不可能的,因为 XML 规范不允许 definition in Extensible Markup Language (XML) 1.0 (Fifth Edition) 控制字符:

      CharRef    ::=      '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'
      

      加上额外的restriction of allowed characters in the same specification

      Char       ::=      #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
      /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
      

      XML 1.1 extends this definition to control characters -- 包含除空字节以外的所有内容:

      Char       ::=      [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
      /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
      

      最后,XQuery relies on the same specification considering allowed characters

      Char       ::=      [http://www.w3.org/TR/REC-xml#NT-Char]
      
    2. 在 XQuery 文档中直接包含空字节。 除了实践中的问题(在文件中包含空字节通常会导致各种意外问题),same limitations to characters as defined above apply(格式正确XML 文档只能由上面定义的字符组成):

      document       ::=      ( prolog element Misc* ) - ( Char* RestrictedChar Char* ) 
      

      Why are “control” characters illegal in XML 1.0? 对此进行了扩展讨论

    【讨论】:

    • 我在 eXist-db 的 httpclient 库的 XML 响应中得到许多 NULL 字符。它们实际上是在开头%00 的url 编码的。我正在解码字符串,然后尝试删除 NULL 字符。给出答案,现在我在解码之前将它们删除。
    【解决方案2】:

    基本上,答案是字符串中不能有任何 NUL (x00) 字符。 XML 以及 XDM 数据模型不允许它们。因此,如果它们出现在您的输入中,您就已经超出了标准的范围。

    【讨论】:

    • 我在 eXist-db 的 httpclient 库的 XML 响应中得到许多 NULL 字符。但它们实际上是在开头%00 进行了url 编码的。我正在解码字符串,然后尝试删除 NULL 字符。给出答案,现在我在解码之前将它们删除。
    猜你喜欢
    • 2011-02-04
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    相关资源
    最近更新 更多