我有以下
XML:
<t>a_35345_0_234_345_666_888</t>
我想用固定数字234替换“_”之后的第一个数字.所以结果应如下所示:
<t>a_234_0_234_345_666_888</t>
我尝试使用以下但它不起作用:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:template match="/"> <xsl:value-of select='replace(.,"(.*)_\d+_(.*)","$1_234_$2")'/> </xsl:template> </xsl:stylesheet>
UPDATE
以下适用于我(感谢@ Chris85).只需删除下划线并添加“?”以使其不贪婪.
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:template match="/"> <xsl:value-of select='replace(.,"(.*?)_\d+(.*)","$1_234$2")'/> </xsl:template> </xsl:stylesheet>
解决方法
你的正则表达式是/贪婪的.*消耗所有内容直到下一个字符的最后一次出现.
所以
(.*)_\d+_(.*)
放了
a_35345_0_234_345_666_
进入1美元.然后888被删除,没有任何东西进入2美元.
为了使它非贪婪添加一个?之后 .*.这告诉*在第一次出现下一个字符时停止.
功能示例:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:template match="/"> <xsl:value-of select='replace(.,"$1_234$2")'/> </xsl:template> </xsl:stylesheet>
这里有一些关于重复和贪婪的文档,http://www.regular-expressions.info/repeat.html.