我正在探索正则表达式。
问题陈述: 使用替换映射中提供的值替换#和#之间的字符串。
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 `"\\#\\#"`
你能解释一下这个区别吗?
答案 0 :(得分:2)
差异相当简单 - MyFilter.doFilter
会匹配两个哈希值,它们之间有一个或多个字符,而\\#(.+?)\\#
会匹配彼此相邻的两个哈希值。
在我看来,一个更有力的问题是\\#\\#
和\\#(.+?)\\#
之间有什么区别?&#34;
在这种情况下,被捕获的是什么(或者不是什么)是不同的。正则表达式中的括号表示捕获组 - 基本上,您想要从整个匹配的字符串中单独输出一些子字符串。在这种情况下,您将捕获散列之间的文本 - 第一个模式将分别捕获并输出,而第二个模式则不会。自己尝试一下 - 在第一个上请求\\#.+?\\#
将返回该文本,而第二个将产生异常,即使它们都匹配相同的文本。
答案 1 :(得分:0)
。+?告诉它与懒惰地匹配(一个或多个)任何东西(直到它看到#)。因此,只要它解析某个实例,它就会停止。
我认为\#\#匹配##所以我认为错误是因为它只匹配那个##然后只有一个组0,没有组1.但是那个部分不是100%。