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

Der*_*hmu 6 regex xslt saxon

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

我正在寻找Non-Breaking-Spaces和En-Spaces,所以我使用了\p{Z}构造.根据Michael Kay的XSLT 2.0程序员参考中的许多示例,这应该可行.RegExBuddy也批准:)

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

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

经过几次试验和错误后,我简单地将支架加倍\p{{Z}}......它有效!?但这次RegExBuddy不赞成!

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

提前致谢!

编辑:我在replace()函数内部尝试了同样的事情,双括号版本不起作用.我不得不用单支架做到这一点!

Lar*_*rsH 8

在属性值模板中,花括号是指示要计算的XPath表达式的特殊语法.如果你想要文字花括号,你必须通过加倍来逃避它们:

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

注意:

变量部分中的表达式可能包含StringLiteral XP内或注释中的非转义大括号.

并非所有属性都是AVT,但analyze-string的regex属性是:

注意:

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

(两篇引文都强调了这一点.)