簡體   English   中英

java正則表達式模式字符串格式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM