替换正则表达式出现
Replace regex occurrences
我有一个输入字符串:
"hello [you], this is [me]"
我有一个将字符串映射到字符串的函数(为简单起见进行了硬编码):
public String map(final String input) {
if ("you".equals(input)) {
return "SO";
} else if ("me".equals(input)) {
return "Kate";
}
...
}
用各自的映射(通过调用 map
函数给出)替换每个 [(.*)?]
事件的最方便的方法是什么?
如果我是正确的,你不能在这里使用 String.replaceAll()
,因为我们事先不知道替换。
您可以这样做:
String line = "hello [you], this is [me]";
Pattern p = Pattern.compile("\[(.*?)\]");
Matcher m = p.matcher(line);
while (m.find()) {
// m.group(1) contains the text inside []
// line.replace(m.group(1), yourMap.get(m.group(1)));
// use StringBuilder to build the new string
}
第一,你的表情很贪婪。匹配方括号中标记的正确表达式是 \[([^\]]*)\]
(Java 需要加倍反斜杠),因为它避免超过右方括号 * .我添加了一个 捕获组 来访问方括号内的内容,如 group(1)
.
这里有一种方法可以满足您的需求:
Pattern p = Pattern.compile("\[([^\]]*)\]");
Matcher m = p.matcher(input);
StringBuffer bufStr = new StringBuffer();
boolean flag = false;
while ((flag = m.find())) {
String toReplace = m.group(1);
m.appendReplacement(bufStr, map(toReplace));
}
m.appendTail(bufStr);
String result = bufStr.toString();
*你也可以用[.*?]
,不过这种勉强的表达方式可能会造成回溯
我有一个输入字符串:
"hello [you], this is [me]"
我有一个将字符串映射到字符串的函数(为简单起见进行了硬编码):
public String map(final String input) {
if ("you".equals(input)) {
return "SO";
} else if ("me".equals(input)) {
return "Kate";
}
...
}
用各自的映射(通过调用 map
函数给出)替换每个 [(.*)?]
事件的最方便的方法是什么?
如果我是正确的,你不能在这里使用 String.replaceAll()
,因为我们事先不知道替换。
您可以这样做:
String line = "hello [you], this is [me]";
Pattern p = Pattern.compile("\[(.*?)\]");
Matcher m = p.matcher(line);
while (m.find()) {
// m.group(1) contains the text inside []
// line.replace(m.group(1), yourMap.get(m.group(1)));
// use StringBuilder to build the new string
}
第一,你的表情很贪婪。匹配方括号中标记的正确表达式是 \[([^\]]*)\]
(Java 需要加倍反斜杠),因为它避免超过右方括号 * .我添加了一个 捕获组 来访问方括号内的内容,如 group(1)
.
这里有一种方法可以满足您的需求:
Pattern p = Pattern.compile("\[([^\]]*)\]");
Matcher m = p.matcher(input);
StringBuffer bufStr = new StringBuffer();
boolean flag = false;
while ((flag = m.find())) {
String toReplace = m.group(1);
m.appendReplacement(bufStr, map(toReplace));
}
m.appendTail(bufStr);
String result = bufStr.toString();
*你也可以用[.*?]
,不过这种勉强的表达方式可能会造成回溯