我遇到了在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提出的模式在这种情况下不起作用。有什么想法吗?
答案 0 :(得分:2)
在您的情况下,问题是\b
标志将查找标点符号,空格以及字符串的开头或结尾。开口括号不属于任何这些类别,因此被省略。
解决此问题的最简单方法是将"\\b"+keyword+"\\b"
替换为"[\\b(]"+keyword+"[\\b)]"
。
在正则表达式语法中,方括号表示正则表达式引擎将尝试匹配其包含的任何字符的一组。
根据this之前的SO问题,似乎\b
和[\b]
不一样。虽然\b
表示单词边界,但[\b]
表示退格符。要解决此问题,只需将"\\b"+keyword+"\\b"
替换为"(\b|\()"+keyword+"(\b|\))"
。
答案 1 :(得分:1)
正则表达式应匹配0或更多字符。以下代码更改将解决问题
String regex = ".*("+keyword+").*";
答案 2 :(得分:0)
例如,您可以修改正则表达式以搜索多个字符 [^ \ w] +“for”+ [^ \ w]使用Java中的Pattern类。
供您参考: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
答案 3 :(得分:0)
基本上,您必须使您的正则表达式适应它可以找到的所有可能的模式。但考虑到您实际处理代码,您最好为该语言构建parser/tokenizer,或者使用已存在的语言。然后你所要做的就是通过代币来找到你想要的东西。