[英]java regex pattern string format
我正在探索正則表達式。
問題陳述: 用替換映射中提供的值替換#和#之間的字符串 。
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 `"\\#\\#"`
你能解釋一下這個區別嗎?
差別非常簡單 - \\\\#(.+?)\\\\#
將匹配兩個哈希值,它們之間有一個或多個字符,而\\\\#\\\\#
將匹配彼此相鄰的兩個哈希值。
在我看來,一個更有力的問題是“ \\\\#(.+?)\\\\#
和\\\\#.+?\\\\#
?”之間的區別是什么?
在這種情況下,不同之處在於捕獲的內容是什么(或不是)。 正則表達式中的括號表示捕獲組 - 基本上,您想要從整個匹配的字符串中單獨輸出一些子字符串。 在這種情況下,您將捕獲散列之間的文本 - 第一個模式將捕獲並單獨輸出,而第二個模式不會。 自己嘗試 - 請求matcher.group(1)
在第一個將返回該文本,而第二個將產生一個異常,即使它們都匹配相同的文本。
。+? 告訴它與懶惰地匹配(一個或多個)任何東西(直到它看到#)。 因此,只要它解析某個實例,它就會停止。
我認為\\#\\#匹配##所以我認為錯誤是因為它只匹配那個##然后只有一個組0,沒有組1.但是那個部分不是100%。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.