2011-06-26 128 views
6

我需要建立一个正则表达式,只有当它不是某个字符串的一部分时才能找到“int”这个单词。帮助建立正则表达式

我想查找int是否在代码中使用。 (不是在一些字符串,只有在常规代码)

例子:

int i; // the regex should find this one. 
String example = "int i"; // the regex should ignore this line. 
logger.i("int"); // the regex should ignore this line. 
logger.i("int") + int.toString(); // the regex should find this one (because of the second int) 

的感谢!

+0

正则表达式应该在Java中工作还是在Java代码中应用表达式? –

+0

只需要checkStyle – Adibe7

+0

是否需要解析文件以检查程序的GRAMMAR在这种情况下很容易 - 如果以'String'标记开头并以''结尾,则忽略int; – Kamahire

回答

4

这不会是防弹的,但这适用于所有测试cas ES:

(?<=^([^"]*|[^"]*"[^"]*"[^"]*))\bint\b(?=([^"]*|[^"]*"[^"]*"[^"]*)$) 

它确实一看后面向前看断言,有没有或前两个/以下报价"

以下是一个Java代码与输出:

String regex = "(?<=^([^\"]*|[^\"]*\"[^\"]*\"[^\"]*))\\bint\\b(?=([^\"]*|[^\"]*\"[^\"]*\"[^\"]*)$)"; 
    System.out.println(regex); 
    String[] tests = new String[] { 
      "int i;", 
      "String example = \"int i\";", 
      "logger.i(\"int\");", 
      "logger.i(\"int\") + int.toString();" }; 

    for (String test : tests) { 
     System.out.println(test.matches("^.*" + regex + ".*$") + ": " + test); 
    } 

输出(包括正则表达式,所以你可以阅读它没有所有这些\ escapes):

(?<=^([^"]*|[^"]*"[^"]*"[^"]*))\bint\b(?=([^"]*|[^"]*"[^"]*"[^"]*)$) 
true: int i; 
false: String example = "int i"; 
false: logger.i("int"); 
true: logger.i("int") + int.toString(); 

使用正则表达式永远不会100%准确 - 您需要一个语言解析器。考虑转义引号中的字符串"foo\"bar",在线评论/* foo " bar */

0

不完全相信你的全部要求是什么,但

$\s*\bint\b 

也许

0

假设输入将每一行,

^int\s[\$_a-bA-B\;]*$ 

它遵循基本的变量命名规则:)

0

如果您认为解析代码和搜索隔离INT字,这个工程:

(^int|[\(\ \;,]int) 

你可以用它来寻找int值代码只能由空格,逗号,“;”并左括号或成为第一行。

你可以在这里尝试一下,提高其http://www.regextester.com/

PS:这适用于所有的测试用例。

0

$ [^“] * \宾特\ b

应该工作。我不能想到一个情况下,你可以在字符后使用有效的int标识“”。 当然,这仅适用于代码限制为每行一条语句的情况。