2013-06-25 149 views
0

我正在準備Oracle認證Java程序員。我正在研究正則表達式。我正在通過javaranch Regular Expression,我無法理解示例中存在的正則表達式。請幫助我理解它。我在這裏添加了供參考的源代碼。謝謝。正則表達式示例混淆

class Test 
{ 
    static Map props = new HashMap(); 
    static 
    { 
    props.put("key1", "fox"); 
    props.put("key2", "dog"); 
    } 

    public static void main(String[] args) 
    { 
    String input = "The quick brown ${key1} jumps over the lazy ${key2}."; 

    Pattern p = Pattern.compile("\\$\\{([^}]+)\\}"); 
    Matcher m = p.matcher(input); 
    StringBuffer sb = new StringBuffer(); 
    while (m.find()) 
    { 
     m.appendReplacement(sb, ""); 
     sb.append(props.get(m.group(1))); 
    } 
    m.appendTail(sb); 
    System.out.println(sb.toString()); 
    } 
} 
+3

那你沒有在該代碼明白了嗎? –

+0

我無法檢測正則表達式。首先,你能幫助我這個正則表達式解釋什麼。 – benz

+0

@benz:看看這個:[www.debuggex.com/r/g6_JM9gTX5RDSA5R](http://www.debuggex.com/r/g6_JM9gTX5RDSA5R) – jlordo

回答

1

Here is a very good tutorial on regular expressions您可能想查看。 The article on quantifiers有兩個部分「懶惰而不是貪婪」和「懶惰的替代品」,這應該很好地解釋這個特殊的例子。

無論如何,這裏是我的解釋。首先,你需要認識到在Java中有兩個編譯步驟。一個將你的代碼中的字符串文字編譯爲一個實際的字符串。這一步已經解釋了一些反斜槓,使Java的接收字符串看起來像

\$\{([^}]+)\} 

現在,讓我們挑選,除了在自由空間模式:

\$  # match a literal $ 
\{  # match a literal { 
(  # start capturing group 1 
    [^}] # match any single character except } - note the negation by^
    +  # repeat one or more times 
)  # end of capturing group 1 
\}  # match a literal } 

所以這真的是匹配的${...}所有出現,其中...可以是除關閉}之外的任何東西。括號中的內容(即...)稍後可以通過m.group(1)訪問,因爲它是表達式中的第一組括號。

這裏有上面的教程中的一些相關的文章(但是你要真正讀懂它的全部 - 這是肯定值得的):

+0

謝謝buettner。我將詳細研究這個教程,並回到這個例子,以便我能理解。因爲我目前很困惑很多博客說^,這意味着開始而不是否定否定。 – benz

+0

@benz它確實如果你在字符類之外使用它。在一個字符類裏面,意思雖然沒有意義,因爲「字符串/行的開始」不是一個字符(而是一個位置)。所以它在角色類中可以有不同的含義。如果它是第一個字符,它會否定這個類。如果它位於字符類中的任何其他位置,則將其簡單地視爲一個字面的'^'。 –

1

說明:

\\$   literal $ (must be escaped since it is a special character that 
      means "end of the string" 
\\{   literal { (i m not sure this must be escaped but it doesn't matter) 
(   open the capture group 1 
    [^}]+  character class containing all chars but } 
)   close the capture group 1 
\\}   literal } 
1
  • \\$:相匹配的文字美元符號。沒有反斜槓,它匹配一個字符串的末尾。
  • \\{:匹配文字開啓大括號。
  • (:捕獲組
    • [^}]的開始:這不是一個右大括號任何字符匹配。
    • +:重複最後一個字符集,它將匹配一個或多個不是花括號的字符。
  • ):關閉捕獲組。
  • \\}:匹配一個文字關閉花括號。

它匹配看起來像${key1}的東西。

+0

謝謝攪拌機。我在很多地方都很困惑,並且在開始的時候會解釋它的博客。另外這個正則表達式中$符號的用法是什麼? – benz

+0

@benz:你知道這個正則表達式的作用嗎? – Blender

+0

攪拌器給我它試圖找到所有的發生{}。我很抱歉,我現在對於正則表達式很新。 – benz