在单个字符的第一个实例上使用XPath:Replace
我试图用替换字符串(如在单个字符的第一个实例上使用XPath:Replace,xpath,Xpath,我试图用替换字符串(如fred-3-1-2)中的第一个字符实例,并将其替换为/,以便生成的字符串是fred/3-1-2。除了在原始字符串中有一个或多个破折号之外,我不能保证关于它的任何其他内容。我很难找到一个与XPath::replace一起工作并始终只匹配-的特定第一个实例的正则表达式模式 我觉得我很接近: (?:.+?)(-)(?:.+) 但是这也匹配完整的字符串,所以这是不好的 请不要提供任何使用普通正则表达式的解决方案正则表达式的“风格”应该遵守XPath/XQuery语义()。您可以
fred-3-1-2
)中的第一个字符实例,并将其替换为/
,以便生成的字符串是fred/3-1-2
。除了在原始字符串中有一个或多个破折号之外,我不能保证关于它的任何其他内容。我很难找到一个与XPath::replace一起工作并始终只匹配-
的特定第一个实例的正则表达式模式
我觉得我很接近:
(?:.+?)(-)(?:.+)
但是这也匹配完整的字符串,所以这是不好的
请不要提供任何使用普通正则表达式的解决方案正则表达式的“风格”应该遵守XPath/XQuery语义()。您可以使用:
replace('fred-3-1-2', '^([^-]*)-','$1/')
结果:
意思是:
从一开始,匹配任何非-
字符,后跟一个-
字符,用第一个捕获的组加上/
性格
注意:XPath/XQuery遵循Perl regexp。您引用的XML模式中的描述在XPath/Xquery中扩展为:“匹配字符串的开头和结尾”、“不情愿的量词”、“捕获的子表达式”、“反向引用”您可以使用:
replace('fred-3-1-2', '^([^-]*)-','$1/')
结果:
意思是:
从一开始,匹配任何非-
字符,后跟一个-
字符,用第一个捕获的组加上/
性格
注意:XPath/XQuery遵循Perl regexp。您引用的XML模式中的描述在XPath/Xquery中扩展为:“匹配字符串的开头和结尾”、“不情愿的量词”、“捕获的子表达式”、“反向引用”纯XPath 1.0解决方案--“无正则表达式:
concat(substring-before('fred-3-1-2', '-'), '/', substring-after('fred-3-1-2', '-'))
如果字符串包含在变量$s
中,并且不知道它是否包含-
,则使用:
concat(
substring(concat(substring-before($s, '-'), '/', substring-after($s, '-')),
1 div contains($s, '-')
),
substring($s, 1 div not(contains($s, '-')))
)
基于XSLT的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="s" select="'fred-3-1-2'"/>
<xsl:variable name="t" select="'fred+3+1+2'"/>
<xsl:template match="/">
<xsl:value-of select="concat(substring-before('fred-3-1-2', '-'), '/', substring-after('fred-3-1-2', '-'))"/>
=================
<xsl:value-of select=
"concat(
substring(concat(substring-before($s, '-'), '/', substring-after($s, '-')),
1 div contains($s, '-')
),
substring($s, 1 div not(contains($s, '-')))
)"/>
===============
<xsl:value-of select=
"concat(
substring(concat(substring-before($t, '-'), '/', substring-after($t, '-')),
1 div contains($t, '-')
),
substring($t, 1 div not(contains($t, '-')))
)"/>
</xsl:template>
</xsl:stylesheet>
纯XPath 1.0解决方案--无正则表达式:
concat(substring-before('fred-3-1-2', '-'), '/', substring-after('fred-3-1-2', '-'))
如果字符串包含在变量$s
中,并且不知道它是否包含-
,则使用:
concat(
substring(concat(substring-before($s, '-'), '/', substring-after($s, '-')),
1 div contains($s, '-')
),
substring($s, 1 div not(contains($s, '-')))
)
基于XSLT的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="s" select="'fred-3-1-2'"/>
<xsl:variable name="t" select="'fred+3+1+2'"/>
<xsl:template match="/">
<xsl:value-of select="concat(substring-before('fred-3-1-2', '-'), '/', substring-after('fred-3-1-2', '-'))"/>
=================
<xsl:value-of select=
"concat(
substring(concat(substring-before($s, '-'), '/', substring-after($s, '-')),
1 div contains($s, '-')
),
substring($s, 1 div not(contains($s, '-')))
)"/>
===============
<xsl:value-of select=
"concat(
substring(concat(substring-before($t, '-'), '/', substring-after($t, '-')),
1 div contains($t, '-')
),
substring($t, 1 div not(contains($t, '-')))
)"/>
</xsl:template>
</xsl:stylesheet>
为什么要用同样的问题创建另一个线程?-你在那里也得到了答案,你甚至用“^^^^^^^这个!^^^^^^^改变你的答案,我会投票一整天!”来评论你为什么用同样的问题创建另一个线程你在那里也得到了答案,你甚至用“^^^^^^这个!^^^^^^改变你的答案,我会投票一整天!”