java正则表达式模式字符串格式

时间:2016-08-20 06:38:19

标签: java regex

我正在探索正则表达式。

问题陈述: 使用替换映射中提供的值替换#和#之间的字符串。

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 `"\\#\\#"`

你能解释一下这个区别吗?

2 个答案:

答案 0 :(得分:2)

差异相当简单 - MyFilter.doFilter会匹配两个哈希值,它们之间有一个或多个字符,而\\#(.+?)\\#会匹配彼此相邻的两个哈希值。

在我看来,一个更有力的问题是\\#\\#\\#(.+?)\\#之间有什么区别?&#34;

在这种情况下,被捕获的是什么(或者不是什么)是不同的。正则表达式中的括号表示捕获组 - 基本上,您想要从整个匹配的字符串中单独输出一些子字符串。在这种情况下,您将捕获散列之间的文本 - 第一个模式将分别捕获并输出,而第二个模式则不会。自己尝试一下 - 在第一个上请求\\#.+?\\#将返回该文本,而第二个将产生异常,即使它们都匹配相同的文本。

答案 1 :(得分:0)

。+?告诉它与懒惰地匹配(一个或多个)任何东西(直到它看到#)。因此,只要它解析某个实例,它就会停止。

我认为\#\#匹配##所以我认为错误是因为它只匹配那个##然后只有一个组0,没有组1.但是那个部分不是100%。