只替换多个空格为不间断空格的Java正则表达式

6

我正在寻找一种Java正则表达式的方法,用于将多个空格替换为不间断空格。两个或更多的空格应该被同样数量的不间断空格所取代,但是单个空格不应该被替换。这需要适用于任意数量的空格。并且开头的字符可能是一个或多个空格。

因此,如果我的字符串起始如下:

TESTING THIS  OUT   WITH    DIFFERENT     CASES

我需要新字符串看起来像这样:
TESTING THIS  OUT   WITH    DIFFERENT     CASES

我可以通过循环遍历字符并根据需要进行替换来完成,但这似乎只是为了一些应该很简单的事情而编写了大量代码。我希望有人知道更加优雅的方法。 - Shane
3个回答

4

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

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

2

编辑:这个方法不能处理标点符号,如果要处理标点符号,需要使用和Sergio的答案相同的方法,但需要分两步进行。因此,这个答案是不够充分的,并已被撤回。


以下是原始答案:

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

首先,将所有空格替换为"&nbsp;"。这很快,因为它不必使用正则表达式。

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

接下来,将任何单个的"&nbsp;"替换为空格。
String replaced2 = replaced.replaceAll("\\b&nbsp;\\b", " ");
System.out.println(replaced2);

结果:

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

这很好用。我只是想知道什么构成了词边界。如果我开始在字符串中放一些非字母字符,它是否仍然可以正确处理? - Shane
这是一个很好的观点;标点符号会完全打破它。由于&nbsp;本身以分号结束,所以它不能处理标点符号,因此需要更多的回溯。而且,如果你要回溯,最好像Serge一样一次性完成。将答案保留为参考,但转换为wiki。 - Michael Myers

2

你也可以完全跳过正则表达式。

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

我没有测试这个,但第一个会找到所有的两个空格并用不间断空格替换它们。第二个会找到白空格数量为奇数的情况并使用两个不间断空格进行修正。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接