【问题标题】:Replace new line/return with space using regex使用正则表达式用空格替换新行/返回
【发布时间】:2012-06-18 10:09:30
【问题描述】:

对于知道的人来说这是一个非常基本的问题。

而不是从那里得到

"This is my text. 

And here is a new line"

收件人:

"This is my text. And here is a new line"

我明白了:

"This is my text.And here is a new line.

知道为什么吗?

L.replaceAll("[\\\t|\\\n|\\\r]","\\\s");

我想我找到了罪魁祸首。

在下一行我执行以下操作:

L.replaceAll( "[^a-zA-Z0-9|^!|^?|^.|^\\s]", "");

这似乎是我的问题。

知道为什么吗?

我显然正在尝试执行以下操作:删除所有非字符,并删除所有新行。

【问题讨论】:

  • 你能做到L.replaceAll("[\\\t|\\\n|\\\r]"," ");吗?
  • 我试过了,这似乎不起作用。

标签: java regex


【解决方案1】:

\s 是正则表达式中空白字符的快捷方式。它在字符串中没有任何意义。 ==> 您不能在替换字符串中使用它。您需要在此处准确放置要插入的字符。如果这是一个空格,请使用 " " 作为替换。

另一件事是:为什么使用 3 个反斜杠作为转义序列?在 Java 中两个就足够了。而且您不需要在字符类中使用|(交替运算符)。

L.replaceAll("[\\t\\n\\r]+"," ");

备注

L 没有改变。如果你想得到你需要做的结果

String result =     L.replaceAll("[\\t\\n\\r]+"," ");

测试代码:

String in = "This is my text.\n\nAnd here is a new line";
System.out.println(in);

String out = in.replaceAll("[\\t\\n\\r]+"," ");
System.out.println(out);

【讨论】:

  • L.replaceAll("[\\t|\\n|\\r]"," "); 似乎也不起作用。
  • 您可能想在字符类之后添加一个+,这样每个空白字符序列只能得到一个空格。
  • @jasonm 我更新了我的解决方案。更改后的字符串返回L 没有更改。这是你的问题吗?
  • ` //如何删除所有new和reutnrs String _L = L.replaceAll("[\\r?\\n|\\t]+",""); //对所有非字符进行归一化 _L = _L.replaceAll( "[^a-zA-Z0-9|^!|^?|^.|^\\s]", ""); //对句子进行归一化 _L = _L.replaceAll("[?|!]", ".");`
  • 以上是我正在使用清理结果的三行代码。
【解决方案2】:

试试

L.replaceAll("(\\t|\\r?\\n)+", " ");

根据系统的不同,换行符是\r\n 或只是\n

【讨论】:

  • 这是错误的。 ? 表示字符类中的文字问号(就像 | 在这里也是文字一样)。四个反斜杠是多余的,即使对于 Java 也是如此。编辑:但这是@adarshr 的错,因为在重新格式化答案时没有去掉多余的反斜杠:)
  • 哦,对不起,我没有意识到这一点。很高兴它现在已修复。
  • 感谢您提供这个替代答案。我试图解决一个类似的问题 - 用我的主机的标准换行符替换所有操作系统的换行符,这种方法可以适应这个问题 - 这是正则表达式:“(\\r?\\n)+”
  • @Keppli 我用|\\n 扩展了你的方式,所以无论哪种换行都存在。
【解决方案3】:

新的行分隔符对于不同的操作系统是不同的 - '\r\n' 用于 Windows 和 '\n' 用于 Linux。

为安全起见,您可以使用正则表达式模式\R - Java 8 引入的换行符匹配器

String inlinedText = text.replaceAll("\\R", " ");

【讨论】:

    【解决方案4】:

    我找到了this

    String newString = string.replaceAll("\n", " ");
    

    虽然,你有一个双线,你会得到一个双倍的空间。我想你可以再做一次 replace all 用一个空格替换双空格。

    如果这不起作用,请尝试这样做:

    string.replaceAll(System.getProperty("line.separator"), " ");
    

    如果我使用“\n”在“字符串”中创建行,我必须在正则表达式中使用“\n”。如果我使用 System.getProperty() 我必须使用它。

    【讨论】:

      【解决方案5】:

      你的正则表达式很好,虽然我会用空字符串替换它

      String resultString = subjectString.replaceAll("[\t\n\r]", "");
      

      您希望“文本”之间有一个空格。和“和”对吗​​?

      当我通过复制您的示例尝试正则表达式时,我得到了那个空间

      "This is my text. "
      

      所以这里一切都很好。也许如果你只是用空字符串替换它就可以了。我不知道你为什么用\s替换它。和交替|在字符类中不是必需的。

      【讨论】:

      • 我没有做jave,但真的有必要添加一个额外的转义字符,比如 \\t 吗?还不够吗?
      • 我认为\t\r\n 只需一个反斜杠即可。然后不会给正则表达式引擎提供字符串\n(它会在内部将其解释为换行符),而是直接给出换行符(我认为是0x0A)。但由于正则表达式中的所有其他反斜杠确实需要加倍(例如\s\b),因此始终使用双反斜杠是惯例。
      • @jasonm 你能保存你的文件以便我们下载吗?这肯定会让我们诊断出发生了什么
      • ...同样,| 不属于那里。无需在字符类中指定 OR,因此 | 只匹配文字 |
      • @AlanMoore 当然,在 char 类中不需要交替
      【解决方案6】:

      您可以使用第一个拆分并使用空格重新加入它。 它肯定会起作用。

      String[] Larray = L.split("[\\n]+");
      L = "";
      for(int i = 0; i<Larray.lengh; i++){
         L = L+" "+Larray[i];  
      }
      

      【讨论】:

        【解决方案7】:

        这应该注意空格、制表符和换行符:

        data = data.replaceAll("[ \t\n\r]*", " ");
        

        【讨论】:

          猜你喜欢
          • 2021-02-01
          • 1970-01-01
          • 2015-09-16
          • 1970-01-01
          • 2010-09-17
          • 1970-01-01
          • 2013-03-09
          • 1970-01-01
          • 2020-09-12
          相关资源
          最近更新 更多