我一直在尝试设计一种用Pattern /
Matcher实例替换多个String#replaceAll调用的方法,希望它比我当前在String中替换文本的方法要快,但是我不确定该怎么做关于它。
这是我要操作的字符串的示例:
@bla@This is a @red@line @bla@of text.
如您所见,有多个@字符,中间有3个字符。情况总是如此。如果我想替换“ @ xxx
@”的每个实例(其中xxx可以是0到9之间的任何小写字母或数字),最有效的解决方法是什么?当前,我正在存储一个Map,其键为’@ xxx
@’子字符串,并且值是我要替换为该特定子字符串的值;我检查整个String是否包含’@ xxx
@’子字符串,并为每个实例调用replaceAll方法,但是我认为这效率很低。
非常感谢你!
TL; DR-
使用模式/匹配器将字符串的子字符串替换为其他字符串会比检查字符串是否包含子字符串并使用String#replaceAll效率更高吗?如果是这样,我将如何处理?
这是相对简单的情况appendReplacement
:
// Prepare map of replacements
Map<String,String> replacement = new HashMap<>();
replacement.put("bla", "hello,");
replacement.put("red", "world!");
// Use a pattern that matches three non-@s between two @s
Pattern p = Pattern.compile("@([^@]{3})@");
Matcher m = p.matcher("@bla@This is a @red@line @bla@of text");
StringBuffer sb = new StringBuffer();
while (m.find()) {
// Group 1 captures what's between the @s
String tag = m.group(1);
String repString = replacement.get(tag);
if (repString == null) {
System.err.println("Tag @"+tag+"@ is unexpected.");
continue;
}
// Replacement could have special characters, e.g. '\'
// Matcher.quoteReplacement() will deal with them correctly:
m.appendReplacement(sb, Matcher.quoteReplacement(repString));
}
m.appendTail(sb);
String result = sb.toString();
演示
问题内容: 我希望将文本“REPLACEME”替换为我的StringBuffer符号。当我打印符号时,它是一个有效的字符串。当我打印查询时,它仍然具有文本REPLACEME而不是符号。为什么? 问题答案: 更改 至: Java中的字符串被设计为不可变的。 这就是为什么不能替换当前字符串 中 的字符,因此它必须返回替换了字符的 新 字符串。 此外,如果你想简单地替换文字,不需要正则表达式的语法支持使
我们使用的是 replaceAll 的 String 方法,我们不能在任何字符串中替换 { 。我们的例子: 尝试过: 误差如下: java.util.regex.PatternSyntaxException:发生非法重复 对任何想法持开放态度!也许有解决方法?!
编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答问题。 我有这个练习。为什么不使用reappeAll?我有一个错误:字符串索引超出范围:1
用给定值替换与指定模式匹配的所有子字符串。 语法 (Syntax) String replaceAll(Pattern from, String replace) 参数 (Parameters) From - 要替换的字符串。 Replace - 替换字符串。 返回值 (Return Type) 返回一个字符串。 例子 (Example) void main() { String s
用该文本上的闭包结果替换所有出现的捕获组。 语法 (Syntax) void replaceAll(String regex, String replacement) 参数 (Parameters) regex - 要与此字符串匹配的正则表达式。 replacement - 将替换找到的表达式的字符串。 返回值 (Return Value) 此方法返回结果String。 例子 (Example)
我尝试了内置方法 String#replaceAll() 来替换我的字符串内容中的所有“$”。但它不起作用。 输出: 预期产出: 编辑:虽然Java正则表达式和美元符号涵盖了答案,但我的问题可能对使用String#replaceAll()时面临同样问题的人有所帮助。字符串replace()和replaceAll()之间的区别也可能有所帮助。 这个问题的两种可能的解决方案是 或