Java用不同的值替换捕获组

时间:2014-04-16 03:38:03

标签: java regex

在java中,我想仅将匹配部分中的捕获组替换为其他值,并且要替换的值取决于捕获组。

例如:

String str = "fname:hello hello:world ffff:off";
Map<String, String> mapping = new HashMap<String, String>();
dat.put("fname", "meme");
dat.put("hello", "below");
dat.put("ffff", "ssss");
Pattern pat = Pattern.compile("([a-zA-Z_]+):");

在上面的代码中,我想用“映射”中找到的相应映射替换模式“pat”的捕获组部分。 即更换后,“str”字符串应转换为“meme:hello below:world ssss:off” 我怎样才能做到这一点? 谢谢你的帮助。

3 个答案:

答案 0 :(得分:4)

请考虑将Stack Overflow Regular Expressions FAQ加入书签以供将来参考。那里有一堆特定于Java的信息,特别是在&#34; Flavor-Specific Information&#34;部分。


这有效:

import  java.util.Map;
import  java.util.HashMap;
import  java.util.regex.Pattern;
import  java.util.regex.Matcher;

public class Replacement  {
   public static final void main(String[] ignored)  {

      String str = "fname:hello hello:world ffff:off";
      Map<String, String> mapping = new HashMap<String, String>();
      mapping.put("fname", "meme");
      mapping.put("hello", "below");
      mapping.put("ffff", "ssss");
      Pattern pat = Pattern.compile("([a-zA-Z_]+):");

      Matcher m = pat.matcher(str);


      StringBuffer sb = new StringBuffer();
      while(m.find())  {
         String rplcWith = mapping.get(m.group(1));
         m.appendReplacement(sb, rplcWith + ":");
      }
      m.appendTail(sb);

      System.out.println(sb);
   }
}

输出:

[C:\java_code\]java Replacement
meme:hello below:world ssss:off

答案 1 :(得分:1)

如果您只想在:之前找到匹配单词,那么创建该表达式并迭代地图会更容易。

import java.util.*;

public class Main{ 
    public static void main(String[] args) {
        String str = "fname:hello hello:world ffff:off";
        Map<String, String> mapping = new HashMap<String, String>();
        mapping.put("fname", "meme");
        mapping.put("hello", "below");
        mapping.put("ffff", "ssss");

        for (String key: mapping.keySet()) 
            str = str.replace(key + ":", mapping.get(key)+":");
        System.out.println(str);
    }
}

这很简单,但足以获得所需的输出:

meme:hello below:world ssss:off

答案 2 :(得分:0)

您可以浏览地图的entrySet并将所有键实例替换为其关联值

for (Entry<String, String> entry : mapping.entrySet()) {
    str.replaceAll(entry.getKey(), entry.getValue();
}

然而,这将有一个不同于你期望的输出字符串,因为单词&#34; hello&#34;出现两次

因此,您将获得meme:hello below:world ssss:off

而不是meme:below below:world ssss:off

这是否能够充分回答您的问题,或者输出是否与您定义它的方式一致至关重要?