【问题标题】:how can I remove multiple new line and space(white char) from a string? [duplicate]如何从字符串中删除多个新行和空格(白色字符)? [复制]
【发布时间】:2016-12-30 14:54:50
【问题描述】:

字符串看起来像这样:" I am seal \n\n \t where are we? "。和印刷版

   I am  seal 

      where are we? 

我想让字符串像:"I am seal\nwhere are we?"

I am seal
where are we?

我正在使用"[\r\n]+", "\n" 这个正则表达式删除新行,但问题是当我尝试删除空格时,它也会删除换行符。我使用了来自Apache-commonStringUtils

更新

同样,行首的空白也被删除。它不应该是连续的。

如何在 Java 中实现这一点?

谢谢。

【问题讨论】:

    标签: java regex string replace


    【解决方案1】:

    更新 #2

    捕获所有初始空格(插入符号^ 断言我们在行首)和其他连续空格:

    ^\\s+|[\\t\\f ](?=[\\t\\f ])|[\\t\\f ]$|\\s+\\z
    

    用空替换它(多行修饰符很重要):

    String str = "   I am   seal \n\n  \t   where are we? ";
    String result = str.replaceAll("(?m)(^\\s+|[\\t\\f ](?=[\\t\\f ])|[\\t\\f ]$|\\s+\\z)", "");
    System.out.println(result);
    

    Live demo

    同样借助class intersection,我们可以使用更短的正则表达式:

    ^\\s+|[\\s&&[^\\r\\n]](?=\\s|$)|\\s+\\z
    

    【讨论】:

    • 感谢您的回复。您的正则表达式仅适用于行首的空白。但它应该删除每一行中的所有连续空白。
    • 不。它应该删除所有连续的空白以及新行,无论是在开头、中间还是结尾。 :)
    • 还需要从第二行的开头删除空格。虽然它不一定是连续的。
    • 每个管道| 表示一个交替,因此您实际上是指[\\t\\f ](?=[\\t\\f ])[\\t\\f ]$。第一个表示空格(\t 制表符、\f 换页符或空格字符),后跟另一个相同字符类的空格。第二面表示出现在每行末尾的所有空白字符。 @密封
    • 这些被\\s+\\z(字符串末尾的空格)和^\\s+(每行开头的空格)捕获。 \s 匹配 [\r\n\t\f ] 类的任何字符。 @密封
    【解决方案2】:

    您的问题中的所有空格和换行符都有区别。
    使用单个正则表达式,您可以决定用哪个替换。

    空格或换行符。
    唉,这需要一个回调函数来查看哪个匹配。
    ([^\S\r\n])+|(?:\r?\n)+
    第 1 组 ?替换为空格:否则替换为换行符。

    更简单的方法是分两步完成。

    用空格替换所有[^\S\r\n]+
    然后用换行符替换所有(?:\r?\n)+

    您可以使用范围 {2,} 而不是 +,这可能会给您带来边缘
    性能提升。

    【讨论】:

    • 感谢您的回复。修剪整个字符串后,除第一行外,每一行都有一个空格。它也应该被删除。换行后可能没有空格。我已经更新了我的问题。
    • 那么你会想要这个[^\S\r\n]*(?:\r?\n)+[^\S\r\n]*|([^\S\r\n])+,或者分两步,首先是[^\S\r\n]*(?:\r?\n)+[^\S\r\n]*,然后是[^\S\r\n]+,并且不要使用{2,}范围量词。
    【解决方案3】:
        str = str.trim().replace("\t", " ");
        while (str.contains("  ") || str.contains("\n\n")) {
            while (str.contains("  ")) {
                str = str.replace("  ", " ");
            }
            while (str.contains("\n\n")) {
                str = str.replace("\n\n", "\n");
            }
            while (str.contains("\n ")) {
                str = str.replace("\n ", "\n");
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 2012-11-19
      • 1970-01-01
      • 2018-03-04
      • 2013-10-06
      • 1970-01-01
      • 2019-04-19
      • 2013-12-11
      • 1970-01-01
      相关资源
      最近更新 更多