2016-08-20 72 views
3

我在探索正则表达式。java正则表达式模式字符串格式

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

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

http://www.rexegg.com/regex-quickstart.html可能有帮助 – emotionlessbananas

回答

2

它们之间的差异相当简单 - \\#(.+?)\\#将匹配两个散列,它们之间有一个或多个字符,而\\#\\#将匹配彼此相邻的两个散列。

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

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

0

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

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

相关问题