java - 使用动态构建的模式匹配带有特殊字符的整个单词
问题描述
我需要在 Java 中匹配字符串中的确切子字符串。我试过了
String pattern = "\\b"+subItem+"\\b";
但如果我的子字符串包含非字母数字字符,它就不起作用。我希望它与 Notepad++ 中的“仅匹配整个单词”功能完全一样。你能帮忙吗?
解决方案
我建议使用明确的单词边界(仅当搜索模式不包含字母、数字或下划线时才匹配字符串):
String pattern = "(?<!\\w)"+Pattern.quote(subItem)+"(?!\\w)";
where(?<!\w)
匹配前面没有单词 char 的位置,(?!\w)
如果在当前位置之后没有单词 char 则失败(请参阅此 regex demo),或者,您可以使用考虑到潜在匹配的前导/尾随特殊字符的变体:
String pattern = "(?:\\B(?!\\w)|\\b(?=\\w))" + Pattern.quote(subword) + "(?:(?<=\\w)\\b|(?<!\\w)\\B)";
请参阅正则表达式演示。
详情:
(?:\B(?!\w)|\b(?=\w))
- 如果下一个字符不是单词字符,则为非单词边界;如果下一个字符为单词字符,则为单词边界Data\[3\]
- 这是一个引用subItem
(?:(?<=\w)\b|(?<!\w)\B)
- 如果前面的 char 是单词 char,则为单词边界,如果前面的 char 不是单词 char,则为非单词边界。
推荐阅读
- javascript - 从按钮复制隐藏字段的值
- reactjs - 在反应中,一些关键字没有定义,但我想我定义了它们
- javascript - 如何通过按钮复制卡片中的对象
- visual-studio-code - 如何修复在vscode中等待键和弦
- angular - 带有 Strapi 的 NgRx 数据(getByKey):无法解构“sourceError”Strapi 的属性“错误”
- python - 当我尝试编写代码以查找第一次出现的查询时,运行无限循环的 Jovian DSA 二进制搜索问题
- javascript - 检查一周是否在两周之间
- php - 不分大小写,检查char是否与字母条件相同 | PHP 和 HTML
- python - Python 根据文件数量对目录进行排序,Stanford Dogs Dataset Pytorch
- node.js - MacOS 上的 Nuxt JS SSL 服务器安装问题