2014-09-11 150 views
0

我正在嘗試在java中爲C++源文件編寫注入器。這只是一個加速代碼編輯過程的基本工具。調試正則表達式

我所掃描的主要是:

ClassName::FunctionName() { 

我用txt2re(http://txt2re.com)來生成我搜索一個正則表達式,等於:

.*?(?:[a-z][a-z0-9_]*).*?((?:[a-z][a-z0-9_]*))(:)(:)((?:[a-z][a-z0-9_]*))(\\().*?(\\)).*?(\\{) 

我的應用程序是用Java編寫的,並在我的測試文件上工作。現在我試圖掃描源代碼的子目錄來應用我的更改,但匹配器掛起。據說一些正則表達式沒有被優化,甚至是錯誤的,所以它是有意義的。在正則表達式方面,我不是一個專家,也不是很堅定地使用它們(它很少發生)。有什麼方法可以加快匹配過程或糾正我的模式?

回答

0

您的搜索將特徵提取到替換表達式中。你需要嗎?我假設你這樣做。我刪除了你不需要的空白選項(即「:?」),並將這些分組弄平。如果你想要做的只是在確定一條匹配線後注入一些代碼,它可以進一步變平。下面是一些代碼,我從txt2re修改:

import java.util.regex.*; 

class Main 
{ 
    public static void main(String[] args) 
    { 
    String txt=" ClassName::function_name123(char *p) { "; 

    String re1="([a-z][a-z0-9_]*)"; // match and group class name 
    String re2="::"; // match and eat exactly :: 
    String re3="([a-z][a-z0-9_]*)"; // match and group function name 
    String re4="(\\(.*\\))"; // match and group round braces (and any parameters between them) 
    String re5="\\s*"; // match and eat whitespace 
    String re6="\\{"; // match and eat exactly { 

    Pattern p = Pattern.compile(re1+re2+re3+re4+re5+re6,Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 
    Matcher m = p.matcher(txt); 
    if (m.find()) 
    { 
     String classname=m.group(1); 
     String funcname=m.group(2); 
     String params=m.group(3); 
     System.out.println("I discovered that class "+classname+" has function "+funcname+params); 
    } 
    } 
} 
+0

我想你的正則表達式,並在有問題的文件更快結束,但現在不是所有出現被發現!儘管我不知道爲什麼... – clambake 2014-09-11 11:14:51

+0

引用差異我的基本功能大綱看起來像這樣:'void ClassName :: FunctionName(void * arg,...)\ n {'但是這不應該有所作爲 – clambake 2014-09-11 11:17:19

+0

如果你想匹配的表達式超過了文件的幾行,(在你的大括號之前用換行符證明),那麼你需要確保你在進行正則表達式匹配之前連接這些行。否則,您將在「void ClassName :: function_name123(void * arg,...)」(它不匹配)上進行匹配,然後匹配「{」(這也不匹配)。 – 2014-09-11 11:41:03

相關問題