求符合要求的XPath 1.0查询:匹配含整词EXAMPLE和数字的<p>元素
XPath 1.0 匹配含大小写不敏感整词"EXAMPLE"且带数字的
元素
需求明确
需要匹配满足以下条件的<p>元素:
- 包含大小写不敏感的整词
EXAMPLE(即EXAMPLE需作为完整单词出现,前后为空格、任意标点符号,或位于字符串开头/结尾) - 元素内包含至少一个数字
- 排除
EXAMPLE与其他字母/数字直接连在一起的情况 - 环境仅支持XPath 1.0
解决方案
以下是符合要求的XPath查询:
//p[ # 检查元素是否包含数字 translate(., translate(., '0123456789', ''), '') != '' and # 大小写不敏感的整词匹配逻辑 ( normalize-space(translate(translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), translate(translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', ''), ' ')) = 'EXAMPLE' or starts-with(normalize-space(translate(translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), translate(translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', ''), ' ')), 'EXAMPLE ') or ends-with(normalize-space(translate(translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), translate(translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', ''), ' ')), ' EXAMPLE') or contains(normalize-space(translate(translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), translate(translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', ''), ' ')), ' EXAMPLE ') ) ]
逻辑解释
1. 数字存在检查
translate(., translate(., '0123456789', ''), '') != ''
- 内层
translate移除所有数字,得到不含数字的文本内容 - 外层
translate保留原文本中所有数字,若结果不为空,说明元素包含至少一个数字
2. 大小写不敏感的整词匹配
这部分通过三步处理文本,覆盖所有整词场景:
- 统一大小写:
translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')将所有小写字母转为大写,实现大小写不敏感匹配 - 标准化分隔符:
translate(upper_text, translate(upper_text, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', ''), ' ')将所有非字母数字字符替换为空格,统一单词分隔规则 - 清理连续空格:
normalize-space(clean_text)合并连续空格并移除首尾空格,得到标准化的文本串
最后通过四个条件覆盖所有整词情况:
- 标准化文本等于
EXAMPLE(单独出现) - 标准化文本以
EXAMPLE开头(作为首个单词) - 标准化文本以
EXAMPLE结尾(作为末尾单词) - 标准化文本包含
EXAMPLE(作为中间单词)
案例验证
匹配成功案例
<p><b>for eXaMpLe:</b> 00887546858</p>:转大写并标准化后为FOR EXAMPLE 00887546858,包含EXAMPLE,且有数字,符合条件<p>test,eXaMpLe:00887546858</p>:转大写并标准化后为TEST EXAMPLE 00887546858,包含EXAMPLE,且有数字,符合条件
匹配排除案例
<p><b>534534tretetEXAMPLE:</b> 00887546858</p>:转大写并标准化后为534534TRETETEXAMPLE 00887546858,无独立的EXAMPLE单词,不符合条件<p><b>EXAMPLE00887546858</p>:转大写并标准化后为EXAMPLE00887546858,EXAMPLE与数字直接连接,不符合整词要求
注意事项
- 该查询自动兼容所有标点符号,无需额外配置,因为非字母数字字符都会被替换为空格
- 若需要扩展支持其他特殊场景(如
EXAMPLE前后有特定符号),可在整词匹配条件中补充对应规则
内容的提问来源于stack exchange,提问作者Price Mitchell
相关产品推荐
相关产品推荐

