我有以下XML:
<t>a_35345_0_234_345_666_888</t>
我想在&#34; _&#34;之后替换第一次出现的数字。具有固定数字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>
更新
以下适用于我(感谢@ Chris85)。只需删除下划线并添加&#34;?使它不贪心。
<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>
答案 0 :(得分:3)
你的正则表达式是贪婪的,.*
会消耗所有内容,直到下一个字符的最后一次出现。
所以
(。*)_ \ 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(., "(.*?)_\d+(.*)", "$1_234$2")'/>
</xsl:template>
</xsl:stylesheet>
以下是关于重复和贪婪的更多文档,http://www.regular-expressions.info/repeat.html。