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

Java正则表达式在字符串外查找变量名,java,regex,Java,Regex,我想在一个文件中查找所有出现的变量名,比如variabletest: int test; 但是当变量名在字符串中时,我不想匹配它,比如 String s = "This is a test!"; 我尝试了([^\“])([a-zA-Z\$][\\w$]*)([^\“]),但它不起作用。也许可以暂时从源代码中删除所有字符串,然后搜索变量名 假设源代码有效(没有语法错误),可以从第一个双引号(“)到下一个双引号剪切所有内容 请注意,只有一个字符的变量名(如d)将需要一些额外的代码,因为d还用于

我想在一个文件中查找所有出现的变量名,比如variable
test

 int test;
但是当变量名在字符串中时,我不想匹配它,比如

String s = "This is a test!";

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

也许可以暂时从源代码中删除所有字符串,然后搜索变量名

假设源代码有效(没有语法错误),可以从第一个双引号(“)到下一个双引号剪切所有内容

请注意,只有一个字符的变量名(如
d
)将需要一些额外的代码,因为
d
还用于强制编译器将前面的数字解释为双精度(例如
double dbl=6d

编辑:我假设您想要构建一个应用程序或一段代码,该应用程序或代码可用于检查变量名。
如果您在编辑器中工作,我建议您使用诸如Netbeans或Eclipse之类的高级编辑器。

否则,如果您还想检查语法是否正确,则需要构建自己的解释器(或从internet下载一些解释器)。

也许可以暂时从源代码中删除所有字符串,然后搜索变量名

假设源代码有效(没有语法错误),可以从第一个双引号(“)到下一个双引号剪切所有内容

请注意,只有一个字符的变量名(如
d
)将需要一些额外的代码,因为
d
还用于强制编译器将前面的数字解释为双精度(例如
double dbl=6d

编辑:我假设您想要构建一个应用程序或一段代码,该应用程序或代码可用于检查变量名。
如果您在编辑器中工作,我建议您使用诸如Netbeans或Eclipse之类的高级编辑器。

否则,如果您还想检查语法是否正确,则需要构建自己的解释器(或从internet下载一些解释器)。

恐怕正则表达式不是解决问题的最佳方法。因为解析源代码时有很多语义要考虑,所以你不太可能想出一个可靠的表达式,它不会被字符串中的逃逸引号之类的东西混淆。 解析源代码(并可靠地检测变量名)的更好方法是使用生成的解析器,该解析器了解要解析的文件的语法。是为此而设计的,它还方便地为Java 1.5提供了一个


它将基本上标记给定的源代码,并向每个标记添加类型信息。通过这种方式,您可以简单地迭代所有标记并重建源代码,同时替换与您的搜索词匹配且类型为variable的所有标记。

恐怕正则表达式并不适合您的问题。因为解析源代码时有很多语义要考虑,所以你不太可能想出一个可靠的表达式,它不会被字符串中的逃逸引号之类的东西混淆。 解析源代码(并可靠地检测变量名)的更好方法是使用生成的解析器,该解析器了解要解析的文件的语法。是为此而设计的,它还方便地为Java 1.5提供了一个


它将基本上标记给定的源代码,并向每个标记添加类型信息。通过这种方式,您可以简单地迭代所有标记并重建源代码,同时替换与您的搜索词匹配且类型为variable的所有标记。

正如我在评论中所说的,通常使用regex进行此操作不是一个好主意。你应该用某种方法来做这件事

但无论如何,这里有一个简单的技巧,在某些情况下可以奏效:

(?xm) \b test \b
(?=
    (?:[^\n"\\]+|\\.)*
    (?:(?:"(?:[^\n"\\]+|\\.)*){2})*
    $
)
引述爪哇语:

"(?m)\\btest\\b(?=(?:[^\n"\\\\]+|\\\\.)*(?:(?:"(?:[^\n"\\\\]+|\\\\.)*){2})*$)"

一些评论和其他东西会破坏它。

正如我在评论中所说,通常使用正则表达式来实现这一点不是一个好主意。你应该用某种方法来做这件事

但无论如何,这里有一个简单的技巧,在某些情况下可以奏效:

(?xm) \b test \b
(?=
    (?:[^\n"\\]+|\\.)*
    (?:(?:"(?:[^\n"\\]+|\\.)*){2})*
    $
)
引述爪哇语:

"(?m)\\btest\\b(?=(?:[^\n"\\\\]+|\\\\.)*(?:(?:"(?:[^\n"\\\\]+|\\\\.)*){2})*$)"

一些注释和其他东西会破坏它。

如果您想在Java中处理所有类型的变量声明,那么RegEx不是正确的方法。几乎不可能捕获所有可能类型的变量声明。文件使用的是什么编程语言?无论如何,使用正则表达式很难做到这一点,因为您需要解析所有的语言结构以获得正确的结果,除了引号之外,还有不同类型的注释,这取决于其他结构的语言。该文件包含Java编程语言。那么,除了RegEx之外,找到文件中所有变量的最佳方法是什么?@user1019710阅读我的答案,我猜你想做什么。许多IDE都有这样的重构功能:也许这是一个选项?如果你想在Java中处理所有类型的变量声明,那么RegEx不是正确的方法。几乎不可能捕获所有可能类型的变量声明。文件使用的是什么编程语言?无论如何,使用正则表达式很难做到这一点,因为您需要解析所有的语言结构以获得正确的结果,除了引号之外,还有不同类型的注释,这取决于其他结构的语言。该文件包含Java编程语言。那么,除了RegEx之外,找到文件中所有变量的最佳方法是什么?@user1019710阅读我的答案,我猜你想做什么。许多IDE都有这样的重构功能:也许这是一个选项?据我所知,解析器验证语法。假设我想重命名一个变量及其所有出现的项。我能这样做吗?@user1019710:我想这肯定是可能的。我可能是在看到你的评论之前,无意中用刚才添加到我答案中的段落回答了这个问题。解析器