【问题标题】:java regex pattern string formatjava 正则表达式模式字符串格式
【发布时间】:2016-08-20 06:38:18
【问题描述】:

我正在探索正则表达式。

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

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

我不明白两者之间的区别

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

你能解释一下区别吗?

【问题讨论】:

标签: java regex


【解决方案1】:

区别很简单——\\#(.+?)\\# 将匹配两个散列,它们之间有一个或多个字符,而\\#\\# 将匹配两个相邻的散列。

在我看来,一个更强大的问题是“\\#(.+?)\\#\\#.+?\\# 之间有什么区别?”

在这种情况下,不同之处在于捕获(或未捕获)什么。正则表达式中的括号表示 捕获组 - 基本上,您希望与整个匹配字符串分开输出一些子字符串。在这种情况下,您正在捕获散列之间的文本 - 第一个模式将单独捕获并输出它,而第二个则不会。自己尝试一下 - 第一个请求 matcher.group(1) 将返回该文本,而第二个将产生异常,即使它们都匹配相同的文本。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 2015-07-03
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多