繁体   English   中英

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

[英]Java regex find variable name outside a string

我想查找文件中所有出现的变量名,比如说变量test

 int test;

但是我不想在字符串中匹配变量名,例如

String s = "This is a test!";

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

恐怕正则表达式并非最适合您的问题。 由于解析源代码时要考虑许多语义,因此您不太可能想出一个可靠的表达式,而不会被字符串中的转义引号引起混淆。

解析源代码(并可靠地检测变量名之类的东西)的一种更好的方法是使用生成的解析器,该解析器了解要解析的文件的语法。 SableCC是为此目的而设计的,它还方便地提供了Java 1.5的语法文件

基本上它将标记给定的源代码,并向每个标记添加类型信息。 这样,您可以简单地遍历所有标记并重建源,同时替换与搜索词匹配且类型可变的每个标记。

正如我在评论中说的那样,通常为此使用正则表达式不是一个好主意。 您应该为此使用某种解析器。

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

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

Java引用:

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

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

暂时删除源代码中的所有字符串, 然后搜索变量名也许是个好主意。

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

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

编辑:我假设您想构建一个应用程序或一段代码,轻量检查变量名。
如果您在编辑器中工作,建议您使用Netbeans或Eclipse之类的高级编辑器。
否则,如果您还想检查语法是否正确,则需要构建自己的解释器(或从Internet下载一些解释器)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM