【问题标题】:difference between replaceFirst() and trim().replaceFirst() [duplicate]replaceFirst() 和 trim().replaceFirst() 之间的区别 [重复]
【发布时间】:2016-02-08 12:45:56
【问题描述】:

我正在使用正则表达式和在字符串开头切割马来编码字符。我遇到了不同的实现:

String Str = new String(".,,¨B<?xml version='1.0' encoding='UTF-8'?> 
str.replaceFirst("(.*)<?xml","<?xml");
str.trim().replaceFirst("(.*)<?xml","<?xml")

输出保持不变。这里有什么区别,应该使用哪一个?

【问题讨论】:

  • 为什么我提出一个合法的问题会遭到反对?
  • 可能是因为搜索 trim 的作用需要两秒钟。
  • 如果您将鼠标悬停在拒绝投票按钮上,文本显示为“此问题未显示任何研究工作”。你的问题没有。你可以用谷歌搜索该代码中的所有方法并找出自己。
  • @Matsemann 我不会这么快做出判断。虽然谷歌搜索会告诉他 trim() 做了什么,但 OO 编程的新手可能不理解像 methodA().methodB() 这样的顺序方法调用,并且可能认为这是第三种不同的方法,独立于 methodA()methodB()。 --- 阅读他的问题:replaceFirst()trim().replaceFirst() 之间的区别” --- 这不是 replaceFirst()trim() 之间的区别”跨度>
  • @TheLima 我没有说原因是好的(我没有投反对票),只是解释了人们为什么这样做

标签: java regex string str-replace


【解决方案1】:

trim() 方法删除前导和尾随空格。在您的情况下,区别在于它删除了 尾随空格,因为您的替换正则表达式将匹配 &lt;?xml 之前的任何字符(包括空格)。

顺便说一句,您应该将正则表达式更改为".*?&lt;\\?xml",原因如下:

  1. 必须将? 转义,否则具有使&lt; 可选的特殊含义。所以你的正则表达式会匹配“hello xml abc”,返回“
  2. 您必须使前面的表达式不贪婪(或“不情愿”),这是通过将.* 更改为.*? 来完成的。尝试输入 str 为“abc
  3. 括号是不必要的。如果您愿意,可以保留它们。

【讨论】:

  • 谢谢你的评论,我会记住的
【解决方案2】:

没有区别...trim() 返回一个String,然后您依次调用replaceFirst();就像直接打电话给String.replaceFirst()一样。

关于方法的功能,trim() 将删除(修剪)String 边缘(开始和结束)的不必要的空白字符。

【讨论】:

    【解决方案3】:

    String.trim() 方法从字符串中删除尾随和前导空格。但是由于您正在测试的字符串没有任何尾随或前导空格,因此以下两个肯定会返回相同的字符串。

    str.replaceFirst("(.*)<?xml","<?xml");
    str.trim().replaceFirst("(.*)<?xml","<?xml")
    

    但是,您的正则表达式只删除前导空格,因此如果测试字符串有尾随空格,结果会有所不同。例如:

    String str = new String("   .,,¨B<?xml version='1.0' encoding='UTF-8'?>  ");
        String str1 = str.replaceFirst("(.*)<?xml", "<?xml");
        String str2 = str.trim().replaceFirst("(.*)<?xml", "<?xml");
    
        System.out.println(str1 + "|");
        System.out.println(str2 + "|");
    

    给你,注意第一个结果仍然有尾随空格。

    <?xml version='1.0' encoding='UTF-8'?>  |
    <?xml version='1.0' encoding='UTF-8'?>|
    

    【讨论】:

    • 非常感谢您的详尽回答!
    【解决方案4】:

    首先,你要了解两种方法:

    1. trim() -> 返回此字符串的副本,删除前导和尾随空格,或者如果该字符串没有前导或尾随空格,则返回此字符串。
    2. replaceFirst(String regex,String replacement) -> 将此字符串的第一个与给定正则表达式匹配的子字符串替换为给定的替换。

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("===========replaceFirst=============");
        String test1 = "I am a teacher in a secondary school";
        String out1 = test1.replaceFirst("a", "an");
        System.out.println(out1);
        System.out.println("===========trim.replaceFirst=============");
        String test2 = "I am a teacher in a secondary school";
        String out2 = test2.trim().replaceFirst("a", "an");
        System.out.println(out2);
    }
    

    输出控制台:

    ============replaceFirst==============
    我是中学老师
    ===========trim.replaceFirst=============
    我是中学老师

    所以,replaceFirst()trim().replaceFirst() 之间没有区别。

    【讨论】:

    • 如果你想显示一个程序的输出是,那么最好从你的控制台复制它,而不是重新编写它。这样可以避免拼写错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2021-07-06
    • 2023-03-15
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多