尝试使用 match() 匹配特定单词
*//id[matches(.,lower-case('*\s?Xander\s?*'))]
例子:
Set of Xanderous- No match
Xander Tray of 6- Match
Tray of 6 pieces Xander- Match
Set of 6 Xander pieces- Match
任何与“Xander”字词完全匹配的实例都是目标。
XPath 正则表达式方言不处理单词边界的原因是,要正确处理,您需要对语言敏感——“单词”是一种文化产物。
您可以执行tokenize(., '\P{L}+') = 'Xander'
which tokenizes 将任何非字母序列视为分隔符,然后测试其中一个标记是否为“Xander”。
我一直在运行一些测试,似乎单词边界没有集成到 XML/XPATH 词汇表中。因此,IMO 下一个最好的事情是测试围绕零个或多个字符的空格或开始/结束字符串锚点。因此,我最终得到:
*//id[matches(lower-case(.),'.*(^|\s)xander($|\s).*')]
更好的办法是全部删除lower-case
并使用第三个matches
参数(标志)将其设置为不区分大小写的匹配:
*//id[matches(.,'.*(^|\s)xander($|\s).*','i')]
粗略地说,如果你想获得完整的行匹配,如果它完全包含 word Xander
,你可以使用\b
which 分隔一个特定的单词,加上一些贪婪的运算符.*
:
^.*\bXander\b.*$
演示:https ://regex101.com/r/PvKptN/1
或者,如果您不需要整行,您可以简单地检查它是否包含Xander
:
\bXander\b
演示:https ://regex101.com/r/PvKptN/2
我希望它满足您正在使用的正则表达式风格