我想在文件中找到所有出现的变量名,让我们说变量test
:
int test;
但我不想在变量名称匹配时匹配变量名称,例如
String s = "This is a test!";
我尝试了([^\"])([a-zA-Z_$][\\w$]*)([^\"])
,但它不起作用。
答案 0 :(得分:2)
我担心正则表达式不适合您的问题。由于解析源代码时需要考虑很多语义,因此您不太可能想出一个可靠的表达式,不会被字符串中的转义引号混淆。
解析源代码(并可靠地检测变量名称之类的东西)的更好方法是使用生成的解析器,该解析器知道要解析的文件的语法。 SableCC专为此而设计,它还方便地为Java 1.5提供grammar file。
它基本上会对给定的源代码进行标记,并为每个标记添加类型信息。这样,您可以简单地遍历所有令牌并重建源,同时替换与您的搜索词匹配的每个令牌,并且类型为变量。
答案 1 :(得分:1)
正如我在评论中所说,通常使用正则表达式并不是一个好主意。你应该使用某种削皮器。
但无论如何这里是一个简单的黑客,适用于某些情况:
(?xm) \b test \b
(?=
(?:[^\n"\\]+|\\.)*
(?:(?:"(?:[^\n"\\]+|\\.)*){2})*
$
)
Java引用:
"(?m)\\btest\\b(?=(?:[^\n"\\\\]+|\\\\.)*(?:(?:"(?:[^\n"\\\\]+|\\\\.)*){2})*$)"
一些评论和其他事情会破坏它。
答案 2 :(得分:0)
也许暂时从源代码中删除所有字符串,然后然后搜索变量名称。
假设源代码有效(没有语法错误),您可以剪切从第一个出现的双引号(“)到下一个双引号的所有内容。
请注意,只有一个字符的变量名称(如d
)将需要一些额外的代码,因为d
也用于强制编译器将前面的数字解释为double(例如{{ 1}})。
编辑:我假设您要构建一个轻量级检查变量名称的应用程序或代码片段。
如果您在编辑器中工作,我建议您使用Netbeans或Eclipse等高级编辑器
否则,如果您还要检查正确的语法,则需要构建自己的解释器(或从Internet下载一些解释器)。