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;=> &amp;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的区别及用法

java 中replace方法?

preg_replace/string_replace 符号 - 或 * 到空格

替代 String.Replace

String replace() 和 replaceAll() 的区别