为什么我需要在RegEx中使用双卷曲括号?

时间:2014-01-30 12:19:52

标签: regex xslt saxon

我在我的一个xsl-transformations(xsl:analyze-string)中运行了一个小正则表达式,并且遇到了这个让我感到不舒服的效果,因为我没有找到任何解释......

我正在搜索非断裂空间和En-Spaces,因此我使用了\p{Z}构造。根据Michael Kay的XSLT 2.0程序员参考中的许多示例,这应该可行。 RegExBuddy也批准:)

现在我的SaxonHE9.4N告诉我了

  

正则表达式出错:net.sf.saxon.trans.XPathException:expected({)

经过多次试验和错误后,我只是将括号加倍\p{{Z}} ......它有效!?但这次RegExBuddy不赞成!

有人可以给我解释一下这种效果吗?我在网上找不到任何令人满意的东西......

提前致谢!

编辑:我在replace()函数内尝试了同样的事情,双括号版本无效。我不得不用单括号做到这一点!

1 个答案:

答案 0 :(得分:8)

在属性值模板中,花括号是指示要评估的XPath表达式的特殊语法。如果你想要文字花括号,you have to escape them by doubling

  

属性值模板由交替序列组成   固定部件和可变部件。可变部分由XPath组成   用大括号({})括起来的表达式。固定部分可能包含   任何字符,除了左大括号必须写为{{   并且右侧花括号必须写成}}

     
    

注意:

         

变量部分中的表达式可能包含未转义的卷曲     在StringLiteral XP中或在注释中括号。

  

并非所有属性都是AVT,而是the regex attribute of analyze-string is

  

注意:

     

因为regex属性是属性值模板,所以卷曲   正则表达式中的括号必须加倍。例如,   要匹配一到五个字符的序列,请写入regex =“。{{1,5}}”。   对于包含许多大括号的正则表达式,它可能更多   方便使用的符号如   regex =“{'[0-9] {1,5} [a-z] {3} [0-9] {1,2}'}”,或使用变量。

(强调在两个引号中都添加了。)