2012-05-17 85 views
0

我已經在性能以下項文件:Java的正則表達式分組

some.key = \n 
    [1:Some value] \n 
    [14:Some other value] \n 
    [834:Yet another value] \n 

我想使用正則表達式解析它,但我似乎無法得到正確的分組。我正在嘗試爲每個條目輸出一個鍵/值。例如:鍵=「834」,值=「另一個價值」

private static final String REGEX_PATTERN = "[(\\d+)\\:(\\w+(\\s)*)]+"; 

private void foo(String propValue){ 
    final Pattern p = Pattern.compile(REGEX_PATTERN); 
    final Matcher m = p.matcher(propValue); 
    while (m.find()) { 
     final String key = m.group(0).trim(); 
     final String value = m.group(1).trim(); 
     System.out.println(String.format("Key[%s] Value[%s]", key, value));    
    } 
} 

我得到的錯誤是:

Exception: java.lang.IndexOutOfBoundsException: No group 1 

我以爲我是正確分組的正則表達式,但我想不會。任何幫助,將不勝感激!

感謝

UPDATE: 逃離括號工作。將模式更改爲以下感謝您的反饋!

private static final String REGEX_PATTERN = "\\[(\\d+)\\:(\\w+(\\w|\\s)*)\\]+"; 
+0

索引超出界限:檢查數組中不存在的元素。大概指向一個未設置的索引 – Alfabravo

+1

Alfabravo - 是的,我知道,但我很好奇爲什麼正則表達式不正確 – user973479

回答

2

[應該被轉義(以及])。

"\\[(\\d+)....\\]+" 

[]用於字符類:[0-9] == (0|1|2|...|9)

0

由於您使用的字符串,由幾行,你應該告訴它Pattern

final Pattern p = Pattern.compile(REGEX_PATTERN, Pattern.MULTILINE); 

雖然直接無關你我建議你添加DOTALL太:

final Pattern p = Pattern.compile(REGEX_PATTERN, Pattern.MULTILINE | Pattern.DOTALL); 
+0

多行事物只有在想要檢測行的開始/結束時纔是重要的。不過,這可能是一個好主意。 – jpaugh

1

這是你的正則表達式,[]特殊字符,需要進行轉義,如果你想從字面上解釋它們。

嘗試

"\\[(\\d+)\\:(\\w+(\\s)*)\\]" 

注 - 我刪除了 '+'。匹配器將繼續找到匹配模式的子串,因此+不是必需的。 (你可能需要喂GLOBAL開關 - 我不記得了)。

我不禁覺得,這可能是沒有正則表達式簡單不過,或許是分裂的\n[,然後在分割爲:每個那些。

2

試試這個:

private static final String REGEX_PATTERN = "\\[(\\d+):([\\w\\s]+)\\]"; 

final Pattern p = Pattern.compile(REGEX_PATTERN); 
final Matcher m = p.matcher(propValue); 
while (m.find()) { 
    final String key = m.group(1).trim(); 
    final String value = m.group(2).trim(); 
    System.out.println(String.format("Key[%s] Value[%s]", key, value)); 
} 
  1. []需求,因爲它們代表一個字符類
  2. group(0)始終是全場比賽的起點和終點進行轉義,所以你的團體應該開始與1
  3. 請注意我是如何寫第二組[\\w\\s]+。這意味着字符類或空白字符