【问题标题】:String parsing, replace new line character字符串解析,替换换行符
【发布时间】:2016-03-09 15:56:16
【问题描述】:

我有一个关于字符串解析的问题。

String str = "jdaskks sms=<hello
hi wini>";

在这里你可以看到,字符串中出现的换行符。 我编写了一个程序,它搜索 sms= string ,然后从 &lt; &gt; 字符中获取子字符串。我在其中检查换行符并将其替换为 ' '

但是当我得到 substring 时我有问题。我替换它。但是如何在原始字符串 str 中更改它,因为我可以看到子字符串的更改不在原始字符串中。

感谢您的帮助。

str.substring(j,str.indexOf('>',j+1)).replaceAll("\n", "#10");
here j is index of '<'

如果我分配这个字符串,我将得到替换字符的子字符串,而不是替换换行符的原始字符串

【问题讨论】:

  • 那么,您只需获取&lt;...&gt; 之间的字符串并将换行符替换为常规空格?
  • @WiktorStribiżew 是的,但我需要更改原始字符串

标签: java regex string


【解决方案1】:

字符串在 Java 中是不可变的 - 像 replace 这样的操作实际上不会更新原始字符串。您必须使用substring 调用的返回值,例如

String updated = str.substring(j,str.indexOf('>',j+1)).replaceAll("\n", "#10");

如果你想在整个字符串中替换它,你可以简单地将它连接回字符串中:

int indexOf = str.indexOf('>',j+1);
str = str.substring(0, j)
    + str.substring(j,indexOf).replaceAll("\n", "#10"))
    + str.substring(indexOf);

【讨论】:

  • 但是,原来的字符串会丢失的权利。在我的示例中,jdaskks 将丢失。我将得到子字符串,而不是替换换行符的原始字符串
  • 关于不可变的哪些部分你不了解?
【解决方案2】:

您可以获取子字符串,但您没有将其分配给字符串或用于显示。因为字符串是immutable

所以只需将结果分配给一个新字符串:

String result= str.substring(j,str.indexOf('>',j+1)).replaceAll("\n", "#10");

或用于展示。

System.Out.Println(str.substring(j,str.indexOf('>',j+1)).replaceAll("\n", "#10"));

【讨论】:

    【解决方案3】:

    由于您创建了一个新的 String 对象但没有将其分配回变量,这是您问题的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 2022-11-17
      相关资源
      最近更新 更多