【问题标题】:Java Regex that only replaces multiple whitepaces with Non-Breaking SpacesJava Regex 仅用不间断空格替换多个空白
【发布时间】:2011-01-23 06:56:55
【问题描述】:

我正在寻找一种用不间断空格替换多个空格的 Java 正则表达式方法。两个或多个空格应替换为相同数量的不间断空格,但不应替换单个空格。这需要适用于任意数量的空格。并且第一个字符可以是 1 个或多个空格。

所以如果我的字符串是这样开始的:

TESTING THIS  OUT   WITH    DIFFERENT     CASES

我需要新的字符串看起来像这样:

TESTING THIS  OUT   WITH    DIFFERENT     CASES

【问题讨论】:

  • 我可以通过循环遍历字符并根据需要进行替换来做到这一点,但这看起来像是很多代码,本来应该很简单。我希望有人知道更优雅的方式。

标签: java html regex


【解决方案1】:

编辑:这不处理标点符号,并且重新处理它以处理标点符号将需要它使用与塞尔吉奥的答案相同的方法,但有两个步骤而不是一个。因此,这是一个不充分的答案,已被撤回。


原答案如下:

我能想到的最直接的方法是两步法。

首先,将所有空格替换为“ ”。这非常快,因为它不必是正则表达式。

String testStr = "TESTING THIS  OUT   WITH    DIFFERENT     CASES";
String replaced = testStr.replace(" ", " ");

接下来,替换“ ”的任何单个实例带空格。

String replaced2 = replaced.replaceAll("\\b \\b", " ");
System.out.println(replaced2);

结果:

TESTING THIS  OUT   WITH    DIFFERENT     CASES

【讨论】:

  • 效果很好。我只是想知道什么构成了单词边界。如果我开始将一些非字母字符放入字符串中,它还能正确处理吗?
  • 这很好;标点符号会完全破坏它。它无法处理标点符号,因为  本身以分号结尾,因此需要更多的回溯。如果你要回溯,你不妨像 Serge 那样一步到位。留下答案作为参考,但转换为 wiki。
【解决方案2】:

让我们使用一些正则表达式(黑色?)魔法。

String testStr = "TESTING THIS  OUT   WITH    DIFFERENT     CASES";
Pattern p = Pattern.compile(" (?= )|(?<= ) ");
Matcher m = p.matcher(testStr);
String res = m.replaceAll("&nbsp;");

该模式查找一个空格后跟另一个空格,或者查找另一个空格后面的空格。这样,它会按顺序捕获所有空白。在我的机器上,使用 java 1.6,我得到了预期的结果:

TESTING THIS&nbsp;&nbsp;OUT&nbsp;&nbsp;&nbsp;WITH&nbsp;&nbsp;&nbsp;&nbsp;DIFFERENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CASES

【讨论】:

    【解决方案3】:

    您也可以一起跳过正则表达式。

    String testStr = "TESTING THIS  OUT   WITH    DIFFERENT     CASES";
    String _replaced = testStr.replace("  ", "&nbsp;&nbsp;");
    String replaced = _replaced.replace("&nbsp; ", "&nbsp;&nbsp;");
    

    我没有对此进行测试,但第一个找到了两个空格的所有情况并用不间断空格替换它们。第二个查找存在奇数个空格的情况,并使用两个 nbsps 进行更正。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      相关资源
      最近更新 更多