Java正则表达式在字符串外部查找变量名称

时间:2012-03-08 14:18:46

标签: java regex

我想在文件中找到所有出现的变量名,让我们说变量test

 int test;

但我不想在变量名称匹配时匹配变量名称,例如

String s = "This is a test!";

我尝试了([^\"])([a-zA-Z_$][\\w$]*)([^\"]),但它不起作用。

3 个答案:

答案 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下载一些解释器)。