XSLT 2.0 正则表达式替换

5

我有以下的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>

更新

以下方法适用于我(感谢@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>

1
目前发生了什么?我认为你需要将其变成非贪婪的 .*?。例如:<xsl:value-of select='replace(., "(.*?)_\d+_(.*)", "$1_234_$2")'/> - chris85
嗨@Chris85 - 謝謝,這很有效!是否有可能更改表達式,以便在末尾使用單詞邊界而不是“_”?通常的單詞邊界(\b)在XSLT中不受支持。我正在使用XSLT 2.0。謝謝! - M Tracker
我不确定,我很少使用XSLT(一年一次或更少)。我更频繁地使用正则表达式,你能描述一下你遇到的问题吗?也许有另一种方法可以解决它? - chris85
以下代码对我有效。只需删除下划线即可。replace(., "(.?)_\d+(.)", "$1_234$2") - M Tracker
1
请在您的问题中更新您当前使用的正则表达式以及您想要实现的目标。 - chris85
你还有其他想要完成的事情吗?还是已经解决了?听起来使用结尾的 _ 对你来说似乎不起作用。 - chris85
1个回答

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>

这里有更多关于重复和贪婪的IT技术文档,请查看http://www.regular-expressions.info/repeat.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接