如何使用Java删除字符串中的重复空格?
Posted
技术标签:
【中文标题】如何使用Java删除字符串中的重复空格?【英文标题】:How to remove duplicate white spaces in string using Java? 【发布时间】:2011-04-26 21:57:58 【问题描述】:如何使用 Java 去除字符串中重复的空格(包括制表符、换行符、空格等)?
【问题讨论】:
【参考方案1】:像这样:
yourString = yourString.replaceAll("\\s+", " ");
例如
System.out.println("lorem ipsum dolor \n sit.".replaceAll("\\s+", " "));
输出
lorem ipsum dolor sit.
\s+
是什么意思?
\s+
是一个正则表达式。 \s
匹配空格、制表符、换行符、回车、换页或垂直制表符,+
表示“其中一个或多个”。因此,上面的代码将折叠所有长于一个字符的“空白子字符串”,并带有一个空格字符。
来源:Java: Removing duplicate white spaces in strings
【讨论】:
@SuhrobSamiev -- String.replaceAll() 自 JDK 1.4 以来一直在 Java 中。 docs.oracle.com/javase/1.4.2/docs/api/java/lang/…, java.lang.String) 我希望我可以为 \s+ 的精彩解释添加超过 +1 的内容。 我理解\s+
但 2 反斜杠 \\ 是什么意思?
字符串文字"\\"
表示由单个反斜杠组成的字符串。所以要代表\s+
,你写"\\s+"
。
这会删除回车吗?还是我必须单独删除“\\r”?谢谢!【参考方案2】:
你可以使用正则表达式
(\s)\1
和
将其替换为$1
。
Java 代码:
str = str.replaceAll("(\\s)\\1","$1");
如果输入为"foo\t\tbar "
,您将得到"foo\tbar "
作为输出但如果输入为"foo\t bar"
,它将保持不变,因为它没有任何连续的空白字符。
如果您将所有空白字符(空格、垂直制表符、水平制表符、回车符、换页符、换行符)视为空格,则可以使用以下正则表达式替换 任何 个连续的一个空格的空白:
str = str.replaceAll("\\s+"," ");
但是如果你想用一个空格替换两个连续的空格,你应该这样做:
str = str.replaceAll("\\s2"," ");
【讨论】:
【参考方案3】:String str = " Text with multiple spaces ";
str = org.apache.commons.lang3.StringUtils.normalizeSpace(str);
// str = "Text with multiple spaces"
【讨论】:
【参考方案4】:试试这个 - 你必须import java.util.regex.*;
Pattern pattern = Pattern.compile("\\s+");
Matcher matcher = pattern.matcher(string);
boolean check = matcher.find();
String str = matcher.replaceAll(" ");
string
是您需要删除重复空格的字符串
【讨论】:
【参考方案5】:嗨,我发现最快(但不是最漂亮的方式)是
while (cleantext.indexOf(" ") != -1)
cleantext = StringUtils.replace(cleantext, " ", " ");
与正则表达式相反,这在 android 上运行得非常快
【讨论】:
仅适用于空格,但不适用于制表符和换行符等其他空格。 我知道,您必须为其他实体添加更多这些 while 循环。但是这段代码在 android 上运行得更快,因为这些正则表达式,我必须处理完整的电子书。 在桌面上也快得多。尚未针对大字符串对其进行测试,但如果您打算在许多小字符串上运行它,这就是您正在寻找的答案。【参考方案6】:虽然为时已晚,但我找到了一个更好的解决方案(对我有用),它将所有连续的相同类型的空白替换为一个其类型的空白。那就是:
Hello!\n\n\nMy World
将会
Hello!\nMy World
请注意,仍然有前导和尾随空格。所以我的完整解决方案是:
str = str.trim().replaceAll("(\\s)+", "$1"));
在这里,trim()
将所有前导和尾随空格字符串替换为“”。 (\\s)
用于捕获 group #1 中的\\s
(即' '、'\n'、'\t'等空格)。 +
符号用于匹配 1 个或多个前面的令牌。所以(\\s)+
可以是任何单个空白字符(' '、'\n' 或 '\t')中的连续字符(1 个或多个)。 $1
用于将匹配字符串替换为匹配类型的group #1 字符串(仅包含1 个空格字符)(即匹配的单个空格字符)。上面的解决方案会变成这样:
Hello!\n\n\nMy World
将会
Hello!\nMy World
我在这里没有找到我上面的解决方案,所以我已经发布了。
【讨论】:
【参考方案7】:如果你想摆脱所有前导和尾随无关空格,那么你想做这样的事情:
// \\A = Start of input boundary
// \\z = End of input boundary
string = string.replaceAll("\\A\\s+(.*?)\\s+\\z", "$1");
然后您可以使用此处列出的其他策略删除重复项:
string = string.replaceAll("\\s+"," ");
【讨论】:
【参考方案8】:您也可以尝试对任何空格、制表符、换行符等使用字符串标记器。一个简单的方法是,
String s = "Your Text Here";
StringTokenizer st = new StringTokenizer( s, " " );
while(st.hasMoreTokens())
System.out.print(st.nextToken());
【讨论】:
【参考方案9】:这可以通过三个步骤来实现:
-
将字符串转换为字符数组(ToCharArray)
在字符数组上申请循环
然后应用字符串替换函数(Replace("sting you want to replace"," original string"));
【讨论】:
这不是一个好的解决方案,放入 char 数组并不能解决任何问题。您实际上并没有解释如何进行替换,这是问题的核心。也请不要发布完全不相关的链接。如果这样做,您将被标记为垃圾邮件发送者。以上是关于如何使用Java删除字符串中的重复空格?的主要内容,如果未能解决你的问题,请参考以下文章
如何从PHP和Javascript中的字符串中删除所有空格[重复]