2016-08-20 62 views
3

我在探索正則表達式。java正則表達式模式字符串格式

問題陳述:#和#之間的替換字符串與替換提供的值映射

import java.util.regex.*; 
import java.util.*; 

public class RegExTest { 
    public static void main(String args[]){ 

     HashMap<String,String> replacements = new HashMap<String,String>(); 
     replacements.put("OldString1","NewString1"); 
     replacements.put("OldString2","NewString2"); 
     replacements.put("OldString3","NewString3"); 

     String source = "#OldString1##OldString2#_ABCDEF_#OldString3#"; 

     Pattern pattern = Pattern.compile("\\#(.+?)\\#"); 
     //Pattern pattern = Pattern.compile("\\#\\#"); 
     Matcher matcher = pattern.matcher(source); 
     StringBuffer buffer = new StringBuffer(); 
     while (matcher.find()) { 
      matcher.appendReplacement(buffer, ""); 
      buffer.append(replacements.get(matcher.group(1)));    
     } 
     matcher.appendTail(buffer); 
     System.out.println("OLD_String:"+source); 
     System.out.println("NEW_String:"+buffer.toString()); 

    } 
} 

輸出:(套餐供應我的要求,但不知道是誰組(1)命令作品)

OLD_String:#OldString1##OldString2#_ABCDEF_#OldString3# 
NEW_String:NewString1NewString2_ABCDEF_NewString3 

如果我更改代碼,如下

Pattern pattern = Pattern.compile("\\#(.+?)\\#"); 

Pattern pattern = Pattern.compile("\\#\\#"); 

我得到以下錯誤:

Exception in thread "main" java.lang.IndexOutOfBoundsException: No group 1 

我不明白

"\\#(.+?)\\#" and `"\\#\\#"` 

之間的區別,你能解釋的區別?

+0

http://www.rexegg.com/regex-quickstart.html可能有幫助 – emotionlessbananas

回答

2

它們之間的差異相當簡單 - \\#(.+?)\\#將匹配兩個散列,它們之間有一個或多個字符,而\\#\\#將匹配彼此相鄰的兩個散列。

在我看來,一個更強大的問題是「\\#(.+?)\\#\\#.+?\\#之間有什麼區別?」

在這種情況下,什麼是(或不是)被捕獲。正則表達式中的括號表示捕獲組 - 基本上,您希望單獨從整個匹配字符串中輸出一些子字符串。在這種情況下,你需要在哈希之間捕獲文本 - 第一個模式將分別捕獲和輸出,而第二個模式不會。嘗試一下 - 第一個請求matcher.group(1)將返回該文本,而第二個會產生一個異常,即使它們都匹配相同的文本。

0

。+?告訴它匹配(一個或多個)任何東西懶惰(直到它看到一個#)。所以一旦它解析了某個事件的實例,就會停止。

我認爲\#\#會匹配##,所以我認爲錯誤是因爲它只匹配那個##然後只有一個組0,沒有組1.但是不是100%。