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

3

我正在学习正则表达式。

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

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());

    }
}

输出:(符合我的要求,但不知道group(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

我不理解“difference between”的区别

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

你能解释一下它们的区别吗?

这个链接可能会有所帮助:http://www.rexegg.com/regex-quickstart.html - bananas
2个回答

2
区别非常明显 - \\#(.+?)\\# 将匹配两个中间有一个或多个字符的哈希符号,而 \\#\\# 将匹配相邻的两个哈希符号。
更有力的问题是,“\\#(.+?)\\#”和“\\#.+?\\#”之间的区别是什么?
在这种情况下,不同之处在于捕获了什么(或未捕获)。正则表达式中的括号表示捕获组 - 基本上就是您想要从整个匹配字符串中单独输出的某个子字符串。在这种情况下,您正在捕获哈希符号之间的文本 - 第一个模式将捕获并单独输出它,而第二个模式则不会。自己尝试一下 - 请求第一个匹配器的matcher.group(1)将返回该文本,而第二个将产生异常,即使它们都匹配相同的文本。

0

.+? 告诉它懒惰地匹配(一个或多个)任何字符(直到看到 # 为止)。因此,一旦解析了一个实例,它就停止。

我认为 \#\# 会匹配 ##,所以我认为错误是因为它只匹配了那一个 ##,然后只有一个 0 组,没有 1 组。但这部分不确定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接