2011-08-30 46 views
0

我必須識別.c文件中的某些字符。現在我不得不承認#define行,但我想排除定義後的評論。例如:Java中的正則表達式解釋source.c文件

#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c)) /* We're doing kernel work */ 

我有這方面的結果:

group1="KERNEL_VERSION" 
group2="(a,b,c) ((a)*65536+(b)*256+(c)) /* We're doing kernel work */" 

我想擺脫/* We're doing kernel work */

我已經嘗試了一切我無法擺脫它。下面是我在哪裏:

Pattern cdef = Pattern.compile("^#[\\t ]*define[\\t ]+(\\w+)[\\t ]*(.*)",Pattern.DOTALL); 

我曾嘗試加入^[\\/\\*\\w+][\\t ]+^\\/+\\*\\w*\\ .....字符串的結束,但無論是我失去所有的第二組,或者什麼也不做

非常感謝,

!!!!編輯:我想找到一種方法來消除C評論,所以:/ *評論* /從模式

編輯2:我看到它的方式我認爲它應該有一種方法來給出以下建議: 「如果你發現‘/ ’,不採取任何東西,我讀通過行的文件行,以便無論是後/可以扔掉:

這是我處理第二組:「......()」所以我嘗試添加^ [\/\]在我的字符串的結尾,但它不工作,我失去了整個第二部分

+1

我沒有解決方案。想想很難實現。我在這裏問了類似的東西:http://stackoverflow.com/questions/5374843/regex-to-find-an-uncommented-println。看一看。 – Heisenbug

+0

謝謝,但它不完全相同,因爲基本上你正在搜索System.out ...但我正在搜索的是/ * xxxx */ – vallllll

回答

1

你幾乎有它。只需在字符串末尾指定註釋即可。就像這樣:

(\\/\\*.*\\*\\/) 

完整的測試程序:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class TestMain { 
    public static void main(String[] args) { 
     Pattern cdef = Pattern.compile("^#[\\t ]*define[\\t ]+(\\w+)[\\t ]*(.*)(\\/\\*.*\\*\\/)", Pattern.DOTALL); 
     Matcher matcher = cdef 
       .matcher("#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c)) /* We're doing kernel work */"); 
     System.out.println(matcher.matches()); 
     for (int n = 0; n <= matcher.groupCount(); n++) 
      System.out.println(matcher.group(n)); 
    } 
} 

輸出:

true 
#define KERNEL_VERSION(a,b,c) ((a)/65536+(b)/256+(c)) /* We're doing kernel work */ 
KERNEL_VERSION 
(a,b,c) ((a)/65536+(b)/256+(c)) 
/* We're doing kernel work */ 
+2

'/'在正則表達式中沒有特殊含義,所以你可以寫成'(/\\*.*\\*/)'。切勿放棄避免在Java正則表達式中使用反斜槓的機會。 ;) –

+0

但是,您的正則表達式*需要*註釋才能出現。我相信OP希望避免在評論中出現這些評論。 –

+0

到Arne和Alan Moore現在完美地工作! – vallllll

0

對我來說,一個簡單的辦法是預處理源序列字符按char和跳過所有像之間:

// don't take all literally, pseudocode below 
while(!EOF) 
{ 
    // read next char 
    ReadChar(); 

    // check for comment start 
    if(prevChar == '/' && curChar == '*') 
    { 
     // remove '/' from output 
     OutputContainer.RemoveLastChar(); 
     while(!(prevChar == '*' && curChar == '/')) 
     { 
      // skip next char 
      SkipChar(); 
     } 
    } 
} 
+0

這是真的,這是簡單的方法或做一個刪除(「xxx」),但我會喜歡在正則表達式中找到一種方法,因爲我正在學習這一點。 – vallllll