首页 > 解决方案 > 使用动态构建的模式匹配带有特殊字符的整个单词

问题描述

我需要在 Java 中匹配字符串中的确切子字符串。我试过了

String pattern = "\\b"+subItem+"\\b";

但如果我的子字符串包含非字母数字字符,它就不起作用。我希望它与 Notepad++ 中的“仅匹配整个单词”功能完全一样。你能帮忙吗?

标签: javaregex

解决方案


我建议使用明确的单词边界(仅当搜索模式不包含字母、数字或下划线时才匹配字符串):

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,则为非单词边界。

推荐阅读