【问题标题】:Finding whole word only in Java string search仅在 Java 字符串搜索中查找整个单词
【发布时间】:2016-01-07 14:48:21
【问题描述】:

我遇到了在我的 Java 程序的较大模式中查找搜索模式的问题。例如,我会尝试查找所有for 循环,但会偶然发现formula。我发现的大多数建议都是关于使用正则表达式搜索,例如

String regex = "\\b"+keyword+"\\b";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(searchString);

或者这个的一些变体。我遇到的问题是我正在浏览代码,而不是像书本一样的文本,每个单词的两边都有空格。例如,这将错过我想找到的for(。还有另一种聪明的方法可以只找到整个单词吗?

编辑:感谢您的建议。关键字从字符串的第一个条目开始的情况如何?例如,

class Vec {
public:
   ...
};

我在哪里搜索class(或者public)。 Thanga、Austin Lee、npinti 和 Kai Iskratsch 建议的模式在这种情况下不起作用。有什么想法吗?

【问题讨论】:

  • 如果keyword 包含在正则表达式中具有特殊含义的特殊符号,要从字面上匹配它们,您需要在它们前面加上斜杠,如\\b
  • \\bkeyword\\b" 仍将匹配 for 中的 for( 但它会跳过 forum
  • 不确定我是否清楚这一点,但尝试匹配 ASCII 值?
  • 再次"\\b"+keyword+"\\b" 将适用于所描述的所有情况

标签: java regex


【解决方案1】:

在您的情况下,问题\b 标志将查找标点符号、空格以及字符串的开头或结尾。左括号不属于任何这些类别,因此被省略。

解决此问题的最简单方法是将"\\b"+keyword+"\\b" 替换为"[\\b(]"+keyword+"[\\b)]"

在正则表达式语法中,方括号表示正则表达式引擎将尝试匹配其包含的任何字符的集合。

根据 this 之前的 SO 问题,\b[\b] 似乎不一样。 \b 代表单词边界,[\b] 代表退格字符。要解决此问题,只需将 "\\b"+keyword+"\\b" 替换为 "(\b|\()"+keyword+"(\b|\))"

【讨论】:

  • 我认为您也必须摆脱困境。还取决于程序代码的语言,您将不得不添加更多例外。一个选项可以是 [\\b\\W]+keyword+[\\b\\W] (\w 匹配任何非单词字符)
  • 不需要[\b(],因为( 不被视为单词字符。
【解决方案2】:

正则表达式应匹配 0 个或更多字符。以下代码更改将解决此问题

String regex = ".*("+keyword+").*";

【讨论】:

  • 这没有找到任何东西
  • @mjswartz 我编辑了我的答案。这适用于您的用例,包括“类”。我测试了这个
【解决方案3】:

您可以修改您的正则表达式以搜索多个字符后缀,例如 [^\w]+"for"+[^\w] 在 Java 中使用 Pattern 类。

供您参考: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

【讨论】:

    【解决方案4】:

    基本上,您必须使您的正则表达式适应它可以找到的所有可能的模式。但是考虑到您实际处理代码,您最好为该语言构建parser/tokenizer,或者使用已经存在的语言。然后您所要做的就是遍历令牌以找到您想要的。

    【讨论】:

      猜你喜欢
      • 2013-09-15
      • 2011-05-08
      • 2017-07-26
      • 1970-01-01
      • 2011-07-02
      • 2021-02-15
      • 1970-01-01
      • 2019-11-03
      相关资源
      最近更新 更多