字符串正则表达式替换

3

我有点困惑。当我从某个地方提取字符串时,它决定在每个字符之间添加空格。

我只需要一个快速的正则表达式来:

  • 将单个空格替换为无空格
  • 将三个空格替换为1个空格(因为 " " 变成了带有额外空格的 "   ")。

有人可以帮助我写这个正则表达式吗?我知道如何处理单个/多个空格,但不知道如何将x个空格转换为1个空格。


在每个字符之间添加空格是什么意思? - Anirudha
4个回答

4
这有点棘手,但以下是一个正则表达式的解决方案:
// becomes "test string"
"t e s t   s t r i n g".replaceAll("( )  | ", "$1");

例子: http://ideone.com/O6DSk

这个方法的作用是,如果匹配到三个空格,则其中一个空格将保存在捕获组1中,但如果匹配到单个空格,则捕获组1为空。当我们用捕获组的内容替换匹配项时,它会将三个空格变成一个并移除单个空格。


非常好。我喜欢这个解决方案。 - brimborium
我非常喜欢这个解决方案。+1 :) - Rohit Jain

3
s = s.replaceAll("\\s{3}", " ");  // Replace 3 spaces with one.

我假设您知道如何解决将单个空格替换为无空格的问题。
  • {n} 精确匹配 n 个空格。
  • {0,n} 匹配 0 到 n 个空格。
  • {4,} 匹配 4 个或更多空格。

要同时将单个空格替换为无空格和3个空格替换为1个空格,您可以使用以下正则表达式:-

s = "He llo   World";
s = s.replaceAll("(\\S)\\s{1}(\\S)", "$1$2").replaceAll("\\s{3}", " ");

System.out.println(s);

输出: -

Hello World
顺序很重要。因为使用第二个正则表达式时,3个空格将被转换成单个空格。如果我们在第一个正则表达式之前使用它,那么最终将被替换为无空格(\\S)\\s{1}(\\S) -> \\S用于确保仅替换单个空格。\\S表示非空格字符。如果没有它,它将用无空格替换所有空格字符。

@F.J 无法理解你在说什么?(\\S)\\s{1}(\\S)将首先替换所有单个空格字符。然后\\s{3}将用一个空格替换3个空格字符。这有什么问题吗? - Rohit Jain
@F.J 好的,也许是我更新帖子之前你添加了那个评论。 :) - Rohit Jain
是的,我的评论是在你第一次发布时发表的,但由于不再适用,我已将其删除。 - Andrew Clark
@F.J 你不应该删除过时的评论。每个人都可以从发布的时间戳和编辑版本中看到先前发生了什么。只删除不适当或错误的评论(没有被任何人回复或引用)。 - brimborium

0
将单个空格替换为无空格,将三个空格替换为一个空格。 这不是正则表达式的工作。 毕竟,这是正则表达式的工作。
input.replaceAll("(?<=\S) (?=\S)", "").replaceAll(" {3,}", " ");

第一个正则表达式替换了所有由非空格(look-behind,(?<=\S))和紧随其后的非空格(look-ahead (?=\S))的单个空格。

另一个正则表达式则处理剩余的三个甚至更多的空格。


0

我认为你可以使用replaceAll()方法,结合以下一些解决方法:

//locate 3 spaces and mark them using some special chars
myString = myString.replaceAll("   ", "@@@"); //use some special combination

//replace single spaces with no spaces
myString = myString.replaceAll(" ", "");

//now replace marked 3 spaces with one space
myString = myString.replaceAll("@@@", " "); //use the same special combination

最后一个应该被替换为""而不是"" - brimborium
1
谢谢。那是个打字错误,我已经更正了。 - Yogendra Singh
这样想也是。如果字符串已经包含“@@@”怎么办? - brimborium
这就是为什么我提到它是一个解决方法,并使用字符串中不被期望的特殊组合。 - Yogendra Singh

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