正则表达帮助

时间:2011-05-25 16:09:42

标签: regex xslt

我正在尝试使用XSLT将XML转换为平面文本。其中一个节点具有以下内容,我需要提取文本“失败”之前出现的字符串 我打算使用analyze-string函数,并且无法为它创建正则表达式。我试图看看我是否可以使用前瞻模式,但无法这样做。

在文本“失败”之前,有人能说出在方括号内提取文本的正则表达式:

文本

[[2500, 4500]] fail(expected [[2100, 3000, 4000, 5000, 5400, 6000, 8000, 10000]])

最终输出

[2500, 4500]

2 个答案:

答案 0 :(得分:2)

/\[(\[.+?\])\] fail/并获取$1

答案 1 :(得分:1)

即使在没有正则表达式的XSLT 1.0(作为单个XPath 1.0表达式)中也可以这样做

substring(substring(normalize-space(substring-before(.,' fail')), 2),
          1,
          string-length(substring(
                           normalize-space(substring-before(.,' fail')), 
                           2)
                        ) -1
           )

因为您的目标是在XSLT中执行此操作,您可以为此复杂表达式的组件定义变量,并获得一个简单且易于理解的代码:

    

 <xsl:template match="/">
     <xsl:variable name="vStart" select=
       "normalize-space(substring-before(.,' fail'))"/>

    <xsl:variable name="vnormString" select=
     "normalize-space($vStart)"/>

    <xsl:variable name="vLen" select="string-length($vnormString)"/>

    "<xsl:value-of select="substring($vnormString, 2, $vLen -2)"/>"
 </xsl:template>
</xsl:stylesheet>

对以下XML文档应用此转换时:

<t>[[2500, 4500]] fail(expected [[2100, 3000, 4000, 5000, 5400, 6000, 8000, 10000]]) </t>

产生了想要的正确结果:

"[2500, 4500]"

解释:使用标准XPath 1.0函数:substring()substring-before()normalize-space()string-length()