在Java中寻找快速,简单的方法来更改此字符串
" hello there "
看起来像这样
"hello there"
在这里我将所有多个空格替换为一个空格,但我也希望字符串开头的一个或多个空格消失。
这样的事情让我部分地在那里
String mytext = " hello there ";
mytext = mytext.replaceAll("( )+", " ");
但不完全是
在Java中寻找快速,简单的方法来更改此字符串
" hello there "
看起来像这样
"hello there"
在这里我将所有多个空格替换为一个空格,但我也希望字符串开头的一个或多个空格消失。
这样的事情让我部分地在那里
String mytext = " hello there ";
mytext = mytext.replaceAll("( )+", " ");
但不完全是
Answers:
试试这个:
String after = before.trim().replaceAll(" +", " ");
String.trim()
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
,以捕获单个空格trim()
与replaceAll()
其他方法相比,这样做所占用的内存更少。不是很多,但是如果多次调用它,它可能会加起来,尤其是在有很多“可修剪空白”的情况下。(Trim()
实际上并没有消除多余的空间,它只是通过移动开始值和结束值来隐藏它。底层char[]
保持不变。)
( ) +
或( ){2,}
应该(稍微)更有效率;)
\\s
将会用所需字符替换任何一组空格。
.trim().replaceAll(" +", " ")
(两个空格)比.trim().replaceAll(" +", " ")
(一个空格)要快。我对只有一个空格和所有双倍空格的字符串进行了时序测试,并且在执行大量操作(数百万个或更多,取决于环境)时,它的速度都大大提高了。
您只需要一个:
replaceAll("\\s{2,}", " ").trim();
在这里,您可以匹配一个或多个空格,并用一个空格替换它们,然后在开头和结尾处修剪空白(实际上,您可以先修剪然后再进行匹配,从而使正则表达式更快地转化,就像有人指出的那样)。
要快速测试一下,请尝试:
System.out.println(new String(" hello there ").trim().replaceAll("\\s{2,}", " "));
它将返回:
"hello there"
"[ ]{2,}"
这将匹配多个空间。
String mytext = " hello there ";
//without trim -> " hello there"
//with trim -> "hello there"
mytext = mytext.trim().replaceAll("[ ]{2,}", " ");
System.out.println(mytext);
输出:
hello there
以下代码将压缩单词之间的任何空格,并删除字符串开头和结尾的任何空格
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
请注意,所有不可打印的字符(包括空格,制表符和换行符)将被压缩或删除
有关更多信息,请参见相应的文档:
试试这个。
样例代码
String str = " hello there ";
System.out.println(str.replaceAll("( +)"," ").trim());
输出值
hello there
首先,它将用单个空格替换所有空格。比起我们必须进行修剪,String
因为如果开始处String
和结束处有空格,则开始处和结束处将String
用单个空格替换所有空间,因此我们需要进行修剪。比你得到你想要的。String
String
String
String
您也可以使用环顾四周。
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("^ +| +$| (?= )", "")
);
}
仅删除前导和尾随空格。
在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 );
大功告成 这是可读的解决方案。
这对我有用
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();
}
请参阅String.replaceAll
。
使用正则表达式"\s"
并替换为" "
。
然后使用String.trim
。
new String(" hello there ").trim().replaceAll("\\s+", " ")
检查这个...
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;
}
模式 .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(" "))
删除字符串中任意位置的空白的最简单方法。
public String removeWhiteSpaces(String returnString){
returnString = returnString.trim().replaceAll("^ +| +$|( )+", " ");
return returnString;
}
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;
}
}
}
上述解决方案是算法复杂度为O(n),不使用任何Java函数。
请使用下面的代码
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();
我知道replaceAll方法要容易得多,但我也想发布此方法。
public static String removeExtraSpace(String input) {
input= input.trim();
ArrayList <String> x= new ArrayList<>(Arrays.asList(input.split("")));
for(int i=0; i<x.size()-1;i++) {
if(x.get(i).equals(" ") && x.get(i+1).equals(" ")) {
x.remove(i);
i--;
}
}
String word="";
for(String each: x)
word+=each;
return word;
}