在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” 我怎样才能做到这一点? 谢谢你的帮助。
答案 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
这是否能够充分回答您的问题,或者输出是否与您定义它的方式一致至关重要?