M T*_*ker 5 regex xml xslt xslt-2.0
我有以下 XML:
<t>a_35345_0_234_345_666_888</t>
Run Code Online (Sandbox Code Playgroud)
我想用固定数字 234 替换“_”之后第一次出现的数字。所以结果应该是这样的:
<t>a_234_0_234_345_666_888</t>
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下方法但它不起作用:
<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>
Run Code Online (Sandbox Code Playgroud)
更新
以下对我有用(感谢@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>
Run Code Online (Sandbox Code Playgroud)
您的正则表达式是/曾经是贪婪的,它.*会消耗所有内容,直到最后一次出现下一个字符。
所以
(.*)_\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>
Run Code Online (Sandbox Code Playgroud)
这里有一些关于重复和贪婪的更多文档,http://www.regular-expressions.info/repeat.html。