2011-06-26 75 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標識「」。 當然,這僅適用於代碼限制爲每行一條語句的情況。