2010-04-19 74 views
1

我試圖解析通常在/etc/default中使用java和正則表達式找到的配置文件。到目前爲止,這是我對每個文件的每一行遍歷代碼:解析文件「/ etc/default」使用java

// remove comments from the line 
int hash = line.indexOf("#"); 
if (hash >= 0) { 
    line = line.substring(0, hash); 
} 

// create the patterns 
Pattern doubleQuotePattern = Pattern.compile("\\s*([a-zA-Z_][a-zA-Z_0-9]*)\\s*=\\s*\"(.*)\"\\s*"); 
Pattern singleQuotePattern = Pattern.compile("\\s*([a-zA-Z_][a-zA-Z_0-9]*)\\s*=\\s*\\'(.*)\\'\\s*"); 
Pattern noQuotePattern = Pattern.compile("\\s*([a-zA-Z_][a-zA-Z_0-9]*)\\s*=(.*)"); 

// try to match each of the patterns to the line 
Matcher matcher = doubleQuotePattern.matcher(line); 
if (matcher.matches()) { 
    System.out.println(matcher.group(1) + " == " + matcher.group(2)); 
} else { 
    matcher = singleQuotePattern.matcher(line); 
    if (matcher.matches()) { 
     System.out.println(matcher.group(1) + " == " + matcher.group(2)); 
    } else { 
     matcher = noQuotePattern.matcher(line); 
     if (matcher.matches()) { 
      System.out.println(matcher.group(1) + " == " + matcher.group(2)); 
     } 
    } 
} 

這個工程,我希望,但我敢肯定,我可以讓這樣小的通過使用更好的正則表達式,但我的天堂」沒有任何運氣。任何人都知道更好的方式來閱讀這些類型的文件?

回答

1

這裏是一個你可以使用的模式相當於thr ee值你具有以上:

Pattern etcPattern = Pattern.compile(
    "\\s*([a-zA-Z_]\\w*)\\s*=\\s*"+ 
    "(\"|'|.{0,0})(.*?)\\2"+ //QUOTE MATCHING 
    "\\s*"); 

有此及家人之間有三個不同之處:首先我取代表達式[a-ZA-Z0-9_]與其預定義字符類\ W(A字字符)。第二部分(QUOTE MATCHING)是一種可以匹配和去除外部均衡報價的模式,但也可以讓您的三種模式做到不平衡的報價。

它首先通過使用圖案(\「|'|。{0,0})。這是

  1. 雙引號
  2. 單引號
  3. 任何零倍

然後你的。*模式後跟一個反向引用\ 2。反向引用表示匹配模式2匹配的內容(引用模式)這就是上述第三種情況很重要的地方,如果該值不以單或雙引號需要能夠忽略它。所以它首先嚐試匹配其中一個引號。如果它不能,那麼它將匹配空字符串,這反過來允許反向引用匹配空字符串。

使其工作的最後變化是將內部。*模式更改爲不願意(對*。*),以便它可以允許引用在可能的情況下與後向引用匹配並被剝離。

所以,你應該能夠運行這個爲:

Matcher matcher = etcPattern.matcher(line); 
if (matcher.matches()) { 
    System.out.println(matcher.group(1) + " == " + matcher.group(3)); 
} 

等同於你上面的例子(注意值是在比賽第3組現在,而不是兩個正如我說,這符合你的模式做了什麼。特別是它會允許不平衡的報價,並允許任何內部引用的價值

+0

偉大的...它的作品非常漂亮。這就是我非常喜歡的原因。偉大的人寫偉大的代碼。 – rmarimon 2010-04-19 21:14:38

+0

快樂這是你正在尋找,快速注意該模式確實允許不平衡的報價(我原本有一個錯別字,它沒有,我已經修復)。 – 2010-04-20 11:01:32

2

您可以使用antlr來生成解析器。基本上,你寫你要使用語言中的語法(或使用許多grammars already written之一,ANTLR會生成一個解析器爲您服務。

+0

我相信一個簡單的正則表達式應該是綽綽有餘,我一直沒有能夠使用(X | Y | Z )構造並剝離雙引號或單引號 – rmarimon 2010-04-19 17:08:59

1

在很多情況下,你可以使用java.util.Properties處理外殼的配置文件。

其實,如果你不把這些文件過於複雜,你可以分享他們的shell腳本和Java程序之間的這種方式。沒有真正處理

事情做好是帶引號的字符串。

+0

引用的字符串是我確切的問題。我可能會使用屬性文件,然後通過值,並刪除引號,但似乎hacky ... – rmarimon 2010-04-19 17:14:55