在 Java 中寻找快速、简单的方法来更改此字符串
" hello there "
看起来像这样的东西
"hello there"
我用一个空格替换所有这些多个空格,除了我还希望字符串开头的一个或多个空格消失。
像这样的东西让我部分在那里
String mytext = " hello there ";
mytext = mytext.replaceAll("( )+", " ");
但不完全。
尝试这个:
String after = before.trim().replaceAll(" +", " ");
也可以看看
String.trim() 返回字符串的副本,省略前导和尾随空格。
返回字符串的副本,省略前导和尾随空格。
正则表达式.info/重复
没有 trim() 正则表达式
也可以仅使用一个 replaceAll
来执行此操作,但与 trim()
解决方案相比,它的可读性要差得多。尽管如此,这里提供它只是为了展示正则表达式可以做什么:
String[] tests = {
" x ", // [x]
" 1 2 3 ", // [1 2 3]
"", // []
" ", // []
};
for (String test : tests) {
System.out.format("[%s]%n",
test.replaceAll("^ +| +$|( )+", "$1")
);
}
有3个替补:
^_+ : 字符串开头的任意空格序列匹配并替换为$1,捕获空字符串
匹配并替换为 $1,它捕获空字符串
_+$ : 字符串末尾的任意空格序列匹配并替换为$1,捕获空字符串
匹配并替换为 $1,它捕获空字符串
(_)+ :任何与上述都不匹配的空格序列,这意味着它在中间匹配并替换为 $1,它捕获单个空格
匹配并替换为 $1,它捕获一个空格
也可以看看
正则表达式.info/Anchors
你只需要一个:
replaceAll("\\s{2,}", " ").trim();
在其中匹配一个或多个空格并将它们替换为单个空格,然后在开头和结尾修剪空格(实际上,您可以通过首先修剪然后匹配来反转,以使正则表达式更快,正如有人指出的那样)。
要快速测试这一点,请尝试:
System.out.println(new String(" hello there ").trim().replaceAll("\\s{2,}", " "));
它会返回:
"hello there"
这对我来说非常有效:sValue = sValue.trim().replaceAll("\\s+", " ");
以下代码将压缩单词之间的任何空格并删除字符串开头和结尾的任何空格
String input = "\n\n\n a string with many spaces, \n"+
" a \t tab and a newline\n\n";
String output = input.trim().replaceAll("\\s+", " ");
System.out.println(output);
这将输出 a string with many spaces, a tab and a newline
请注意,任何不可打印的字符,包括空格、制表符和换行符都将被压缩或删除
有关更多信息,请参阅相应的文档:
字符串#trim() 方法
String#replaceAll(String regex, String replacement) 方法
有关 Java 正则表达式实现的信息,请参阅 Pattern 类的文档
"[ ]{2,}"
这将匹配多个空格。
String mytext = " hello there ";
//without trim -> " hello there"
//with trim -> "hello there"
mytext = mytext.trim().replaceAll("[ ]{2,}", " ");
System.out.println(mytext);
输出:
hello there
trim() 方法删除前导和尾随空格,并使用 replaceAll("regex", "string to replace") 方法和正则表达式 "\s+" 匹配多个空格并将其替换为单个空格
myText = myText.trim().replaceAll("\\s+"," ");
要消除字符串开头和结尾的空格,请使用 String#trim()
方法。然后使用您的 mytext.replaceAll("( )+", " ")
。
您可以先使用 String.trim()
,然后对结果应用正则表达式替换命令。
试试这个。
示例代码
String str = " hello there ";
System.out.println(str.replaceAll("( +)"," ").trim());
输出
hello there
首先,它将用单个空格替换所有空格。比我们应该做的修剪 String
因为 String
的开头和 String
的结尾如果 String
在 String
的开头和结尾有空格,它将用单个空格替换所有空格String
所以我们需要修剪它们。比你得到你想要的 String
。
String blogName = "how to do in java . com";
String nameWithProperSpacing = blogName.replaceAll("\\\s+", " ");
修剪()
仅删除前导和尾随空格。
来自 Java Doc,“返回一个字符串,其值为该字符串,删除了任何前导和尾随空格。”
System.out.println(" D ev Dum my ".trim());
“Dev Dum my”
替换(),替换所有()
替换单词中的所有空字符串,
System.out.println(" D ev Dum my ".replace(" ",""));
System.out.println(" D ev Dum my ".replaceAll(" ",""));
System.out.println(" D ev Dum my ".replaceAll("\\s+",""));
输出:
"DevDummy"
"DevDummy"
"DevDummy"
注意:“\s+”是类似于空格字符的正则表达式。
参考:https://www.codedjava.com/2018/06/replace-all-spaces-in-string-trim.html
到目前为止,提供了很多正确的答案,我看到了很多赞成票。但是,上述方法将起作用,但并未真正优化或真正不可读。我最近遇到了每个开发人员都会喜欢的解决方案。
String nameWithProperSpacing = StringUtils.normalizeSpace( stringWithLotOfSpaces );
你完成了。这是可读的解决方案。
在 Kotlin 中它看起来像这样
val input = "\n\n\n a string with many spaces, \n"
val cleanedInput = input.trim().replace(Regex("(\\s)+"), " ")
你也可以使用环视。
test.replaceAll("^ +| +$|(?<= ) ", "");
或者
test.replaceAll("^ +| +$| (?= )", "")
<space>(?= )
匹配后跟另一个空格字符的空格字符。因此,在连续的空格中,它将匹配除最后一个之外的所有空格,因为它后面没有空格字符。这会在删除操作后为您留下一个用于连续空格的空格。
例子:
String[] tests = {
" x ", // [x]
" 1 2 3 ", // [1 2 3]
"", // []
" ", // []
};
for (String test : tests) {
System.out.format("[%s]%n",
test.replaceAll("^ +| +$| (?= )", "")
);
}
String str = " hello world"
先减少空格
str = str.trim().replaceAll(" +", " ");
首字母大写,其他全部小写
str = str.substring(0,1).toUpperCase() +str.substring(1,str.length()).toLowerCase();
你应该这样做
String mytext = " hello there ";
mytext = mytext.replaceAll("( +)", " ");
将 + 放在圆括号内。
String str = " this is string ";
str = str.replaceAll("\\s+", " ").trim();
请参阅String.replaceAll
。
使用正则表达式 "\s"
并替换为 " "
。
然后使用 String.trim
。
这对我有用
scan= filter(scan, " [\\s]+", " ");
scan= sac.trim();
其中 filter 是以下函数,而 scan 是输入字符串:
public String filter(String scan, String regex, String replace) {
StringBuffer sb = new StringBuffer();
Pattern pt = Pattern.compile(regex);
Matcher m = pt.matcher(scan);
while (m.find()) {
m.appendReplacement(sb, replace);
}
m.appendTail(sb);
return sb.toString();
}
删除字符串中任意位置的空格的最简单方法。
public String removeWhiteSpaces(String returnString){
returnString = returnString.trim().replaceAll("^ +| +$|( )+", " ");
return returnString;
}
检查这个...
public static void main(String[] args) {
String s = "A B C D E F G\tH I\rJ\nK\tL";
System.out.println("Current : "+s);
System.out.println("Single Space : "+singleSpace(s));
System.out.println("Space count : "+spaceCount(s));
System.out.format("Replace all = %s", s.replaceAll("\\s+", ""));
// Example where it uses the most.
String s = "My name is yashwanth . M";
String s2 = "My nameis yashwanth.M";
System.out.println("Normal : "+s.equals(s2));
System.out.println("Replace : "+s.replaceAll("\\s+", "").equals(s2.replaceAll("\\s+", "")));
}
如果 String 仅包含单个空格,则 replace() 不会替换,
如果空格多于一个,则 replace() 操作执行并删除空格。
public static String singleSpace(String str){
return str.replaceAll(" +| +|\t|\r|\n","");
}
计算字符串中的空格数。
public static String spaceCount(String str){
int i = 0;
while(str.indexOf(" ") > -1){
//str = str.replaceFirst(" ", ""+(i++));
str = str.replaceFirst(Pattern.quote(" "), ""+(i++));
}
return str;
}
Pattern.quote("?") 返回文字模式字符串。
在我使用正则表达式作为更好的解决方案找到第二个答案之前,我的方法。也许有人需要这段代码。
private String replaceMultipleSpacesFromString(String s){
if(s.length() == 0 ) return "";
int timesSpace = 0;
String res = "";
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(c == ' '){
timesSpace++;
if(timesSpace < 2)
res += c;
}else{
res += c;
timesSpace = 0;
}
}
return res.trim();
}
流版本,过滤空格和制表符。
Stream.of(str.split("[ \\t]")).filter(s -> s.length() > 0).collect(Collectors.joining(" "))
String myText = " Hello World ";
myText = myText.trim().replace(/ +(?= )/g,'');
// Output: "Hello World"
string.replaceAll("\s+", "");
如果你已经在你的项目中使用了 Guava (v. 19+),你可能想要使用这个:
CharMatcher.whitespace().trimAndCollapseFrom(input, ' ');
或者,如果您需要完全删除空格符号(
或 U+0020
,请参阅 more whitespaces),请使用:
CharMatcher.anyOf(" ").trimAndCollapseFrom(input, ' ');
public class RemoveExtraSpacesEfficient {
public static void main(String[] args) {
String s = "my name is mr space ";
char[] charArray = s.toCharArray();
char prev = s.charAt(0);
for (int i = 0; i < charArray.length; i++) {
char cur = charArray[i];
if (cur == ' ' && prev == ' ') {
} else {
System.out.print(cur);
}
prev = cur;
}
}
}
上面的解决方案是不使用任何java函数的复杂度为O(n)的算法。
请使用以下代码
package com.myjava.string;
import java.util.StringTokenizer;
public class MyStrRemoveMultSpaces {
public static void main(String a[]){
String str = "String With Multiple Spaces";
StringTokenizer st = new StringTokenizer(str, " ");
StringBuffer sb = new StringBuffer();
while(st.hasMoreElements()){
sb.append(st.nextElement()).append(" ");
}
System.out.println(sb.toString().trim());
}
}
您好抱歉耽误了!这是您正在寻找的最佳和最有效的答案:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MyPatternReplace {
public String replaceWithPattern(String str,String replace){
Pattern ptn = Pattern.compile("\\s+");
Matcher mtch = ptn.matcher(str);
return mtch.replaceAll(replace);
}
public static void main(String a[]){
String str = "My name is kingkon. ";
MyPatternReplace mpr = new MyPatternReplace();
System.out.println(mpr.replaceWithPattern(str, " "));
}
所以这个例子的输出将是:我的名字是 kingkon。
但是,此方法还将删除您的字符串可能具有的“\n”。因此,如果您不想这样做,只需使用以下简单方法:
while (str.contains(" ")){ //2 spaces
str = str.replace(" ", " "); //(2 spaces, 1 space)
}
如果你也想去掉前导和尾随空格,只需添加:
str = str.trim();
trim()
然后执行replaceAll()
比反过来执行它使用的内存更少。不是很多,但是如果它被多次调用,它可能会加起来,特别是如果有很多“可修剪的空白”。 (Trim()
并没有真正消除额外的空间 - 它只是通过移动开始和结束值来隐藏它。底层char[]
保持不变。)( ) +
或( ){2,}
应该(非常)更有效;)\\s
替换空格 ` ` 将用所需字符替换任何空白组。.trim().replaceAll(" +", " ")
(有两个空格)比.trim().replaceAll(" +", " ")
(有一个空格)快。我对只有单个空格和所有双空格的字符串进行了计时测试,并且在执行 lot 操作(数百万或更多,具体取决于环境)时,两者的速度都快得多。