我遇到了在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"再次适用于所描述的所有情况

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

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

在regex语法中,方括号表示一组regex引擎将尝试匹配其所包含的任何字符的集合。

根据前面的SO问题,似乎\b和[\b]是不同的。 \b表示单词边界,而[\b]表示退格字符。要解决此问题,只需将"\\b"+keyword+"\\b"替换为"(\b|\()"+keyword+"(\b|\))"。

我认为您也必须摆脱困境。 还取决于程序代码是什么语言,您将不得不添加更多的异常。 一个选项可以是[\ b \ W] +关键字+ [\ b \ W]( w匹配任何非单词字符)

不需要[\b(],因为(不被视为文字字符。

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

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

这什么都找不到

@mjswartz我编辑了答案。 这适用于您的用例,包括"类"。 我测试了

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

您可以修改正则表达式以搜索多个字符后缀,例如

[^ w] +" for" + [^ w]使用Java中的Pattern类。