Java中的正则表达式 - 删除不必要的空格

时间:2015-03-06 13:48:09

标签: java regex string replace

每当我需要带有正则表达式的东西时,我都会遇到困难......

现在,我需要转一些模糊文字...... 在旧的,非常古老的数据库中,某些系统不允许用户格式化他们的文本...因此,用户有创意,输入如下表达式:

S O M E   T E X T   I   W O U L D   L I K E   T O   H I G H L I G H T

我的问题是,如何将该文字转换为:

SOME TEXT I WOULD LIKE TO HIGHLIGHT

使用Java中的正则表达式。

对于这个愚蠢的问题感到抱歉,但我花了很多时间试图解决这个问题。

5 个答案:

答案 0 :(得分:3)

这个正则表达式将在中间为您提供一个空格,即单词之间的单个空格。

String r = "S O M E   T E X T   I   W O U L D   L I K E   T O   H I G H L I G H T";
System.out.println(r.replaceAll("(\\s){2,}|\\s", "$1"));

<强>输出:

SOME TEXT I WOULD LIKE TO HIGHLIGHT

这背后的想法是,上面的正则表达式将捕获来自两个或更多连续空格和所有其他空格或进一步匹配的单个空间。用组索引1中的字符替换匹配的空格将为您提供所需的输出。

Regex Demo

答案 1 :(得分:2)

使用一个模式,没有Lookaheads,没有单词边框锚点

text.replaceAll("\\s(\\s?)\\s*", "$1")

<强>解释

  • 替换最小长度为1(\ s)的任何空格序列
  • 如果下一个字符是空格((\ s?)匹配)=&gt;用空格替换
  • else((\ s?)不匹配)替换为空字符串
  • 在(\ s *)
  • 之后捕获所有空格

答案 2 :(得分:1)

如果单词由多个空格分隔,则可以使用负向前看

\s(?!\s)

Regex demo

<强>测试

"S O M E   T E X T   I   W O U L D   L I K E   T O   H I G H L I G H T"
.replaceAll("\\s(?!\\s)", "")
.replaceAll("\\s+", " ");
=> SOME TEXT I WOULD LIKE TO HIGHLIGHT

答案 3 :(得分:1)

所以你可以使用replaceAll("(.)\\s", "$1")

示例:

String s = "S O M E   T E X T   I   W O U L D   L I K E   T O   H I G H L I G H T";
s = s.replaceAll("(.)\\s", "$1");
System.out.println(s);

输出:SOME TEXT I WOULD LIKE TO HIGHLIGHT


说明:

将您的文字视为两个字符块(我将使用^^##标记它们)。

S O M E   T E X T
^^##^^##^^##^^##

如果你仔细观察,你会发现你想要从每一对中删除第二个字符(这是空格),并留下第一个字符:

S O M E   T E X T
^ # ^ # ^ # ^ # T - T will not be affected (will stay) 
                    because it doesn't have space after it.

您可以使用(.)\s正则表达式

来实现它
  • .代表任何字符(包括空格)
  • \s代表任何空白

这样,第一个字符将被放置在组中(索引为1),这允许我们通过$xx中使用来自此部分的匹配,其中(?<=\\S)\\s表示组索引。< / p>


Ver.2 (如果要删除的空格不仅位于奇数索引位置)

解决此问题的其他方法是仅删除

这些空格
  • 紧跟在非空格字符S O M E T E X T ^ ^ ^ ^ ^ ^ ^

    之后
    \\s(?=\\s)
  • 放在其他空格S O M E T E X T ^ ^ ^ ^##### ^ ^ ^

    之前
    s = s.replaceAll("(?<=\\S)\\s|\\s+(?=\\s)", "");
    

这样你可以看到剩下一个空格(单词就在word之前),所以你的解决方案看起来像

{{1}}

答案 4 :(得分:0)

如果保证所有字词之间都有 两个或更多 空格,那么:

  • 首先,删除字符之间的所有空格

    input.replaceAll("(?<=\\S)\\s(?=\\S)", "");
    
  • 然后,只用一个

    替换单词之间的所有多个空格
    input.replaceAll("\\s{2,}", " ");
    

因此,完整的代码看起来像

String input = "S O M E   T E X T   I   W O U L D   L I K E   T O   H I G H L I G H T";
input = input.replaceAll("(?<=\\S)\\s(?=\\S)", "").replaceAll("\\s{2,}", " ");

System.out.println(input); // SOME TEXT I WOULD LIKE TO HIGHLIGHT