XQuery:特定字符多次出现之前/之后的子字符串?

XQuery:特定字符多次出现之前/之后的子字符串?,xquery,xpath-2.0,Xquery,Xpath 2.0,我有这个字符串($str):67-89-90T,我想保留67-89 当然,substring before($str,'-')返回67,但如何选择第二个破折号?好,我终于找到了functx:substring before last。不选择特定的破折号,但在这种情况下对我有效 XPath 2解决方案应该是: replace("67-89-90T", "(.*)-[^-]*$", "$1") (如果没有-,也可以工作,因为它不匹配并且不替换任何内容)使用标记化的XPath 2.0解决方案可能比使

我有这个字符串($str):
67-89-90T
,我想保留
67-89


当然,
substring before($str,'-')
返回
67
,但如何选择第二个破折号?

好,我终于找到了
functx:substring before last
。不选择特定的破折号,但在这种情况下对我有效


XPath 2解决方案应该是:

replace("67-89-90T", "(.*)-[^-]*$", "$1")

(如果没有-,也可以工作,因为它不匹配并且不替换任何内容)

使用标记化的XPath 2.0解决方案可能比使用正则表达式更可读和更容易理解:

string-join(tokenize(concat($vStr,'-'), '-')
                                     [.][not(position() eq last())], 
            '-')
string-join(tokenize(concat('-', '67-89-90T','-'), '-')
                                     [.][not(position() eq last())], 
            '-')
67-89
当使用XQuery处理器或XPath 2.0处理器运行时,表达式:

string-join(tokenize(concat($vStr,'-'), '-')
                                     [.][not(position() eq last())], 
            '-')
string-join(tokenize(concat('-', '67-89-90T','-'), '-')
                                     [.][not(position() eq last())], 
            '-')
67-89
生成所需的正确结果:

string-join(tokenize(concat($vStr,'-'), '-')
                                     [.][not(position() eq last())], 
            '-')
string-join(tokenize(concat('-', '67-89-90T','-'), '-')
                                     [.][not(position() eq last())], 
            '-')
67-89

您可能对另一种不使用正则表达式的解决方案感兴趣。@DimitreNovatchev:虽然从技术上讲,tokenize也使用正则表达式regex@BeniBela,是的,但是对于
tokenize()
的大多数用法,就像这个用法一样,第二个传递的参数是“just a string”。你真的认为它更可读吗?但我很失望,我希望你发布一个XPath 1解决方案…@BeniBela,它比正则表达式更可读——因为在这种情况下,读者不应该知道一种全新的语言——正则表达式。如果格式正确,它的可读性会更高。