2012-12-24 41 views
0

我必須解析具有鍵值對的屬性文件,並且可能會對某些行進行註釋(!或#,兩者均有效)。正則表達式讀取prop文件條目不能正確捕獲組

了Exa:

key1 val1 
Key2 val2 
#key3 val3 
# key4 val4 
# It does not have = symbol 
# Spaces can be any where. 
... 

如果行沒有被註釋掉然後讀取鍵和值匹配的組值。我用下面的正則表達式和代碼片段,但它不是捕獲鍵和值如預期:

String inputs[] = { 
      "key1 val1", 
      "Key2 val2", 
      "#key3 val3", 
      " # key4 val4"    
    }; 

    Pattern PATTERN = Pattern.compile("^(\\s*[^#!]\\s*)(\\w*)\\s+(\\w*).*$"); 
    for (int i = 0; i < inputs.length; i++) { 

     System.out.println("Input: " + inputs[i]); 
     Matcher matcher = PATTERN.matcher(inputs[i]); 
     if(matcher.matches()) { 
      int groupCount = matcher.groupCount(); 
      if(groupCount > 0) { 
       for (int j = 1; j <= groupCount; j++) { 
        System.out.println(j + " " + matcher.group(j)); 
       } 
      } else { 
       System.out.println(matcher.group()); 
      } 

     } else { 
      System.out.println("No match found."); 
     } 
     System.out.println(""); 
    } 

這裏是輸出:

Input: key1 val1 
1 k 
2 ey1 
3 val1 

Input: Key2 val2 
1 K 
2 ey2 
3 val2 

Input: #key3 val3 
No match found. 

Input: # key4 val4 
No match found. 

我的想法是:

^   - Start of line 
(\\s*[^#!]\\s*) - space(s) followed by NO # or ! followed by space(s) 
(\\w*)  - Key 
\\s+  - spaces(s) 
(\\w*)  - Value 
.*   - Anything 
$   - End of line 

請幫我瞭解這裏出了什麼問題。 爲什麼它捕獲鍵的第一個字符作爲一個組?

+2

爲什麼不使用Java屬性文件? –

+0

+1 to @JavierDiaz:Java屬性文件具有您描述的語法,您不需要解析它,只需將其作爲屬性文件讀取即可。 – fge

回答

0

您不必檢查否#或!你可以簡單地做:/^(?<key>\w+)\s*(?<value>.*)/gm

Javafied正則表達式:^(?<key>\\w+)\\s*(?<value>.*)(使用多選項)

演示+解釋:http://regex101.com/r/aM0xK1

0

我不會給你的解決方案,但我會給你答案您的問題:

(\\s*[^#!]\\s*) < - 這就是爲什麼捕獲第一個字符。你有兩個選擇:

  1. 使用非捕獲組(?:Hi, im a non capturing group)(見(?:)

    PS:使用非捕獲組將增加正則表達式的內部指針,所以它不是真正的你想。所以最好使用第二個選項。

  2. 使用回顧後,看如果X之前的字符是一個#!

作爲第三個解決方案中使用Java屬性文件With this pretty example.

0
Input: key1 val1 
1 k 
2 ey1 
3 val1 

這是正確的根據你的正則表達式。

(\\s*[^#!]\\s*) this is the group1. 

它表示匹配單個字符,而不是#,不是!角色前後可能會有空格。所以對於你的prop文件中的第一行。 「k」是角色。

你可能想檢查負面看。它是零寬度斷言。

例如像這樣:(第2組是關鍵)

^\s*(?!<#|!)\s*(\w*)..... 

希望它可以幫助...