我有点困惑。当我从某个地方提取字符串时,它决定在每个字符之间添加空格。
我只需要一个快速的正则表达式来:
- 将单个空格替换为无空格
- 将三个空格替换为1个空格(因为
" "
变成了带有额外空格的" "
)。
有人可以帮助我写这个正则表达式吗?我知道如何处理单个/多个空格,但不知道如何将x个空格转换为1个空格。
// becomes "test string"
"t e s t s t r i n g".replaceAll("( ) | ", "$1");
这个方法的作用是,如果匹配到三个空格,则其中一个空格将保存在捕获组1中,但如果匹配到单个空格,则捕获组1为空。当我们用捕获组的内容替换匹配项时,它会将三个空格变成一个并移除单个空格。
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
表示非空格字符。如果没有它,它将用无空格
替换所有空格字符。(\\S)\\s{1}(\\S)
将首先替换所有单个空格字符。然后\\s{3}
将用一个空格替换3个空格字符。这有什么问题吗? - Rohit Jaininput.replaceAll("(?<=\S) (?=\S)", "").replaceAll(" {3,}", " ");
第一个正则表达式替换了所有由非空格(look-behind,(?<=\S)
)和紧随其后的非空格(look-ahead (?=\S)
)的单个空格。
另一个正则表达式则处理剩余的三个甚至更多的空格。
我认为你可以使用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