XPath:匹配整个单词(使用匹配函数和不区分大小写的标志)

时间:2012-05-01 20:09:34

标签: regex search xpath xpath-2.0

使用XPath,我想"匹配整个单词" (用户选项,就像在VS搜索中一样)。

似乎函数containsmatches的工作方式类似,但匹配允许i之类的标志用于区分大小写。

换句话说,我使用这两个XPath查询获得了相同的结果:

<pets>
    <dog name="Rupert" color="grey"/>
    <dog name="Ralph" color="brown"/>
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>
    <cat name="Fluffy" color="black"/>
</pets>

Matches XPath: //cat[descendant-or-self::*[@*[matches(.,'Cat')]]]
    returns:
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>


Contains XPath: //cat[descendant-or-self::*[@*[contains(.,'Cat')]]]
    returns:
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>

但我想使用matches返回符合&#34; Cat&#34;的结果。全文只有:

<cat name="Cat" color="grey"/>

如何调整匹配查询以使其与整个单词匹配?

修改: 我忘了提到我还需要使用匹配函数,因为我需要不区分大小写的标记。

5 个答案:

答案 0 :(得分:5)

如果使用^$字符作为锚点呢?

//cat[descendant-or-self::*[@*[matches(.,'^Cat$')]]]

来自RegEx Syntax in XQuery 1.0 and XPath 2.0

  

添加了两个元字符 ^ $ 。默认情况下,元字符    ^ 匹配整个字符串的开头,而 $ 匹配整个字符串的结尾   整个字符串。

答案 1 :(得分:2)

这对你有用吗?

//cat[@*='Cat']

答案 2 :(得分:2)

这里有三个相关的函数/运算符。

matches()执行正则表达式匹配;您可以使用它来匹配子字符串或使用锚点(^ cat $)匹配整个字符串,并且您可以设置'i'标志以使其成为盲区。

contains()与子字符串完全匹配;您可以使用第三个参数(排序规则)来请求大小写盲,但指定排序规则的方式取决于您使用的处理器。

eq运算符与整个字符串完全匹配; “默认排序规则”(在XPath的情况下通常使用处理器的API设置)可用于请求大小写盲匹配。这似乎是最符合您要求的那个,唯一的缺点是指定排序规则比使用匹配()的“i”标志更依赖于系统。

答案 3 :(得分:2)

  

但是我想使用匹配来返回与“Cat”匹配的结果   全文只有:

<cat name="Cat" color="grey"/>

有不同的XPath表达式可以选择想要的元素

使用:

/*/cat[matches(@name, '^cat$', 'i')]

或使用:

/*/cat[lower-case(@name) eq 'cat']

基于XSLT的验证

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select=
   "/*/cat[matches(@name, '^cat$', 'i')]"/>
======
  <xsl:copy-of select=
   "/*/cat[lower-case(@name) eq 'cat']"/>

 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时:

<pets>
    <dog name="Rupert" color="grey"/>
    <dog name="Ralph" color="brown"/>
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>
    <cat name="Fluffy" color="black"/>
</pets>

此转换会评估两个XPath表达式并将所选元素复制到输出

  <cat name="Cat" color="grey"/>
======
  <cat name="Cat" color="grey"/>

答案 4 :(得分:1)

此:

//cat[@*='Cat']

结果:

<cat name="Cat" color="grey"/>

我使用Xacobeo进行了验证。