0

尝试使用 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”字词完全匹配的实例都是目标。

4

3 回答 3

2

XPath 正则表达式方言不处理单词边界的原因是,要正确处理,您需要对语言敏感——“单词”是一种文化产物。

您可以执行tokenize(., '\P{L}+') = 'Xander'which tokenizes 将任何非字母序列视为分隔符,然后测试其中一个标记是否为“Xander”。

于 2020-09-10T11:30:17.283 回答
1

我一直在运行一些测试,似乎单词边界没有集成到 XML/XPATH 词汇表中。因此,IMO 下一个最好的事情是测试围绕零个或多个字符的空格开始/结束字符串锚点。因此,我最终得到:

*//id[matches(lower-case(.),'.*(^|\s)xander($|\s).*')]

更好的办法是全部删除lower-case并使用第三个matches参数(标志)将其设置为不区分大小写的匹配:

*//id[matches(.,'.*(^|\s)xander($|\s).*','i')] 
于 2020-09-10T09:59:14.160 回答
-1

粗略地说,如果你想获得完整的行匹配,如果它完全包含 word Xander,你可以使用\bwhich 分隔一个特定的单词,加上一些贪婪的运算符.*

^.*\bXander\b.*$

演示:https ://regex101.com/r/PvKptN/1

或者,如果您不需要整行,您可以简单地检查它是否包含Xander

\bXander\b

演示:https ://regex101.com/r/PvKptN/2

我希望它满足您正在使用的正则表达式风格

于 2020-09-10T09:43:12.960 回答