String 类中replace 和replaceAll方法的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了String 类中replace 和replaceAll方法的区别相关的知识,希望对你有一定的参考价值。
一、参数不同
replace的参数是char和CharSequence,既可以支持字符的替换,也支持字符串的替换。
replaceAll的参数是regex,即基于规则表达式的替换,比如,可以通过replaceAll("\\\\d", "*")把一个字符串所有的数字字符都换成星号。
二、替换结果不同
replace只替换第一个出现的字符(受javascript的影响),replaceall替换所有的字符,简而言之,replace用新串序列替换旧串序列,而replaceall是用新串替换与前面正则表达式相匹配的位置的字符串。
三、用法不同
replaceAll支持正则表达式,replace不支持。
例如:
字符串中多个空格转成一个空格。
public class TestString
public static void main(String[] args)
String s = " ";
System.out.println("a" + s.replaceAll(" +", " ") + "b");
System.out.println("a" + s.replace(" +", " ") + "b");
参考技术A 乍一看,字面上理解好像replace只替换第一个出现的字符(受javascript的影响),replaceall替换所有的字符,其实大不然,只是替换的用途不一样,简而言之,replace用新串序列替换旧串序列,而replaceall是用新串替换与前面正则表达式相匹配的位置的字符串。public String replace(char oldChar,char newChar)
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的。 如 果 oldChar 在此 String 对象表示的字符序列中没有出现,则返回对此 String 对象的引用。否则,创建一个新的 String 对象,用来表示与此 String 对象表示的字符序列相等的字符序列,除了每个出现的 oldChar 都被一个 newChar 替换之外。
public String replaceAll(String regex,String replacement)使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的每个子字符串。此方法调用的 str.replaceAll(regex, repl) 形式产生与以下表达式完全相同的结果:
Pattern.compile(regex).matcher(str).replaceAll(repl)
参数:
regex – 用来匹配此字符串的正则表达式
返回:得到的 String
抛出: PatternSyntaxException – 如果正则表达式的语法无效。
实际应用:
public static void main(String[] arg) throws OgnlException
String s =”sdf\\a\\aa”;
//把s中的反斜杠\ 替换为\\
System.out.println(s);
System.out.println(s.replaceAll(“\\\\”, “\\\\\\\\”));
System.out.println(s.replace(“\\”, “\\\\”));
可以看出上面两种都返回相同的替换结果。
这 里的关键是String.replaceAll()是用regular expression 来作为参数的。但是java本身的字符串对于转义符\也有类似的处理。首先,java会把“\\\\”解释成一个字符串(其中包含两个char)——“\ \”这个就是你在JDK的文档里看到的。
接下来,由于replaceAll是以正则表达式作为参数,所以“\\”被解释成一个regex。对于一个regex来说这就代表着一个字符,就是“\”。对后面的那个8个\来说,最终会被解释成“\\”。
换言之,假设String.replaceAll()是以普通字符串,而不是regex作为参数,那么这样写代码: String target = source.replaceAll(‘\\’, ‘\\\\’); 就可以了。
No related posts. 参考技术B replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是:
1)replace的参数是char和CharSequence,既可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串);
2)replaceAll的参数是regex,即基于规则表达式的替换,比如,可以通过replaceAll("\\d", "*")把一个字符串所有的数字字符都换成星号;
相同点是都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串,如果只想替换第一次出现的,可以使用
replaceFirst(),这个方法也是基于规则表达式的替换,但与replaceAll()不同的时,只替换第一次出现的字符串;
另外,如果replaceAll()和replaceFirst()所用的参数据不是基于规则表达式的,则与replace()替换字符串的效果是一样的,即这两者也支持字符串的操作;
还有一点注意:执行了替换操作后,源字符串的内容是没有发生改变的.
举例如下:
String src = new String("ab43a2c43d");
System.out.println(src.replace("3","f"));=>ab4f2c4fd.
System.out.println(src.replace('3','f'));=>ab4f2c4fd.
System.out.println(src.replaceAll("\\d","f"));=>abffafcffd.
System.out.println(src.replaceAll("a","f"));=>fb43fc23d.
System.out.println(src.replaceFirst("\\d,"f"));=>abf32c43d
System.out.println(src.replaceFirst("4","h"));=>abh32c43d.本回答被提问者和网友采纳 参考技术C if (null != nsr.getPhoneNum() && nsr.getPhoneNum().length() > 0)
nsr.setPhoneNum(nsr.getPhoneNum().replaceAll(" ", "%"));
就是替换功能
替代多个 String.Replaces [重复]
【中文标题】替代多个 String.Replaces [重复]【英文标题】:Alternative to multiple String.Replaces [duplicate] 【发布时间】:2012-08-13 23:52:14 【问题描述】:我的代码连续多次使用String.Replace
:
mystring = mystring.Replace("somestring", variable1);
mystring = mystring.Replace("somestring2", variable2);
mystring = mystring.Replace("somestring3", variable1);
我怀疑有更好更快的方法来做到这一点。你有什么建议?
【问题讨论】:
如果variable1
包含文本"somestring2"
,那么您的首选行为是什么?或者如果variable1
是"g2"
而mystring
是"somestrinsomestring"
,那么首选的行为是什么?
【参考方案1】:
对于“简单”的替代方案,只需使用 StringBuilder....
StringBuilder sb = new StringBuilder("11223344");
string myString =
sb
.Replace("1", string.Empty)
.Replace("2", string.Empty)
.Replace("3", string.Empty)
.ToString();
【讨论】:
这样更容易吗?我看到的唯一好处是它可以减少对 GC 的压力。 @Daniel Hilgarth 我所说的“更简单”的意思是实现起来仍然很简单,但是在 StringBuiler 上将替换链接在一起比在常规字符串上调用它“更好更快”并且不包括下面列出的一些正则表达式解决方案的复杂性。 这似乎是所提出的解决方案中可读性最强的。 如果需要设置条件就不好了 答案是 44 吗?【参考方案2】:我们是否正在设法使这更难了解正在发生的事情?
如果是这样,正则表达式是你的朋友
var replacements = new Dictionary<string,string>()
"somestring",someVariable1,
"anotherstring",someVariable2
;
var regex = new Regex(String.Join("|",replacements.Keys.Select(k => Regex.Escape(k))));
var replaced = regex.Replace(input,m => replacements[m.Value]);
直播:http://rextester.com/SXXB8348
【讨论】:
看起来不错,但是在编译正则表达式时,您需要在 dic 键周围调用Regex.Escape
。另请注意,它在技术上不会做同样的事情。它可能适用于 OP 的测试用例,但理论上,如果您有类似的情况,将“1”替换为“2”,然后将“2”替换为“3”,OP 的代码将导致每个“1”变为“3”而你的最终会导致“2”。只要您实际上没有用 OP 的示例替换之前迭代中已替换的内容,那么这将正常工作。
@Servy - 你说得很好。但是,我的第一句话应该指出,这是一种非常糟糕的多次替换方式。
@Jamiec:这有什么问题?它可能只需要读取字符串一次,只需复制字符串一次,让您轻松查找整个单词,让您对单词进行适当的大写,并让您执行转义字符串之类的操作(例如&amp;
=> &amp;
, "
=>&quot;
) 无需担心替换发生的顺序。
这(不幸的是)比多次调用 string.Replace() 慢得多。我也在寻找一种更快的方法来做到这一点;多次循环一个字符串似乎很浪费。
此 RegEx 解决方案只通过一次即可正确替换所有项目。在某些情况下(比如我的),这是唯一的选项,调用 .Replace 不起作用。为什么?考虑变量 1 部分包含字符串“somestring2”的情况。然后第二个 .Replace 最终会破坏您想要替换的第一件事,等等。【参考方案3】:
您至少可以将这些语句链接起来:
mystring = mystring.Replace("somestring", variable1)
.Replace("somestring2", variable2)
.Replace("somestring3", variable3);
【讨论】:
【参考方案4】:拨打Replace
三次不仅是一个有效的答案,它可能是首选:
RegEx 需要三个步骤:解析、执行、公式化。但是String.Replace
是硬编码的,因此在许多情况下它具有出色的速度。复杂的 RegEx 不如格式良好的 Replace
语句链具有可读性。 (比较Jonathan的解决方案和Daniel的解决方案)
如果您仍然不相信Replace
更适合您的情况,那就来一场比赛吧!并排尝试这两种方法并使用Stopwatch
来查看您在使用数据时节省了多少毫秒。
但是DON'T optimize prematurely!任何开发人员都更喜欢可读性和可维护性,而不是执行速度***毫秒的神秘意大利面条。
【讨论】:
【参考方案5】:这篇文章Regex: replace multiple strings in a single pass with C#可能会有所帮助:
static string MultipleReplace(string text, Dictionary replacements)
return Regex.Replace(text,
"(" + String.Join("|", adict.Keys.ToArray()) + ")",
delegate(Match m) return replacements[m.Value];
);
// somewhere else in code
string temp = "Jonathan Smith is a developer";
adict.Add("Jonathan", "David");
adict.Add("Smith", "Seruyange");
string rep = MultipleReplace(temp, adict);
【讨论】:
这与 Jamiec 的回答基本相同,但没有(必需的)转义。【参考方案6】:取决于您的数据的组织方式(您要替换的内容)或您拥有的数据数量;数组和循环可能是个好方法。
string[] replaceThese = "1", "2", "3";
string data = "replace1allthe2numbers3";
foreach (string curr in replaceThese)
data = data.Replace(curr, string.Empty);
【讨论】:
【参考方案7】:如果您不想使用 RegEx,请将此类添加到您的项目中, 它使用扩展方法“MultipleReplace”:
public static class StringExtender
public static string MultipleReplace(this string text, Dictionary<string, string> replacements)
string retVal = text;
foreach (string textToReplace in replacements.Keys)
retVal = retVal.Replace(textToReplace, replacements[textToReplace]);
return retVal;
那么你就可以使用这段代码了:
string mystring = "foobar";
Dictionary<string, string> stringsToReplace = new Dictionary<string,string>();
stringsToReplace.Add("somestring", variable1);
stringsToReplace.Add("somestring2", variable2);
stringsToReplace.Add("somestring3", variable1);
mystring = mystring.MultipleReplace(stringsToReplace);
【讨论】:
赞成这个。它允许您从数据表中构建过滤器,这非常有用。所以当你有很多过滤器(在我的例子中是 50 个)并且你有 1k 个句子要通过时,这就是猫的喵喵声。【参考方案8】:我首选的方法是使用Regex
的强大功能来解决多重替换问题。这种方法的唯一问题是您只能选择一个 string
来替换。
以下内容会将所有'/'
或':'
替换为'-'
以生成有效的文件名。
Regex.Replace("invalid:file/name.txt", @"[/:]", "-");
【讨论】:
以上是关于String 类中replace 和replaceAll方法的区别的主要内容,如果未能解决你的问题,请参考以下文章
JAVA中string.replace和string.replaceAll的区别及用法
JAVA中string.replace和string.replaceAll的区别及用法