ChatGPT解决这个技术问题 Extra ChatGPT

从Java中的字符串中删除空格

我有一个这样的字符串:

mysz = "name=john age=13 year=2001";

我想删除字符串中的空格。我试过 trim() 但这只会删除整个字符串前后的空格。我也尝试了 replaceAll("\\W", ""),但随后 = 也被删除了。

我怎样才能实现一个字符串:

mysz2 = "name=johnage=13year=2001"
您对“name=johnage=13year=2001”字符串有什么计划?我希望不要解析它。
@JonasElfström 我想它可以帮助进行字符串比较
如果字符串实际上是 = " " 怎么样?就像我提到的那样, trims() 所做的只是清除空字符串吗? @zymat?

D
Dave Jarvis

st.replaceAll("\\s+","") 删除所有空格和不可见字符(例如制表符、\n)。

st.replaceAll("\\s+","")st.replaceAll("\\s","") 产生相同的结果。

第二个正则表达式比第一个快 20%,但随着连续空格数的增加,第一个比第二个执行得更好。

将值分配给变量,如果不直接使用:

st = st.replaceAll("\\s+","")

我想指出,如果您希望用单个空格(或其他一些字符集)替换所有空格,这两个正则表达式会产生不同的结果。如果您有连续的空格,则使用 \\s 它将用给定的字符替换每个空白字符。给定 \\s+ 它将用单个替换字符串替换每组空格。我可以看到很多情况,人们可能会来这篇文章,用不只是空字符串的东西替换空格,这可能会有所帮助。
但如果它位于字符串的开头,它不会删除空格。
@lonesome 为此使用 .trim()
只需使用来自 apache-commons 的 StringUtils。它是一个名为 StringUtils.deleteWhitespace 的静态方法。
如果您想在循环中使用此方法,您应该将 Pattern 定义为最终变量 Pattern.compile("\\s"),因为 replaceAll 在每次调用 return Pattern.compile(regex).matcher(this).replaceAll(replacement); 时重新编译模式。
n
nitro2k01
replaceAll("\\s","")

\w = 任何单词字符

\W = 任何非单词字符(包括标点符号等)

\s = 任何空格字符(包括空格、制表符等)

\S = 任何非空格字符(包括字母和数字,以及标点符号等)

(编辑:正如所指出的,如果您希望 \s 到达正则表达式引擎,则需要转义反斜杠,从而产生 \\s。)


F
Fletch

这个问题最正确的答案是:

String mysz2 = mysz.replaceAll("\\s","");

我只是从其他答案中改编了这段代码。我发布它是因为除了正是问题所要求的之外,它还表明结果作为新字符串返回,原始字符串没有像某些答案暗示的那样被修改。

(有经验的 Java 开发人员可能会说“当然,你不能真正修改字符串”,但这个问题的目标受众很可能不知道这一点。)


这是否意味着我们可以覆盖原始字符串,例如: S = S.replaceAll("\\s", "");而首先替换将完成,然后 S 将收到 S 的字符剥离版本
@frogeyedpeas 这会覆盖变量 S 但它不会覆盖 S 指向的字符串。
拯救了我的一天! ;)
E
Erkan Haspulat

replaceAll("\\s", "")怎么样。请参阅here


迟到一分钟会有多大的不同!
j
jahir

处理字符串操作的一种方法是来自 Apache commons 的 StringUtils。

String withoutWhitespace = StringUtils.deleteWhitespace(whitespaces);

您可以找到它here。 commons-lang 包含更多内容并且得到很好的支持。


A
Amer Qarabsa

如果您还需要删除牢不可破的空格,您可以像这样升级您的代码:

st.replaceAll("[\\s|\\u00A0]+", "");

这失败了:" ab c "
@MohdFarid 应用了修复程序,现在必须没问题。
我认为应该是 st.replaceAll("[\\s|\u00A0]+", "");
l
learningIsFun

你应该使用

s.replaceAll("\\s+", "");

代替:

s.replaceAll("\\s", "");

这样,它将在每个字符串之间使用多个空格。上述正则表达式中的 + 符号表示“一个或多个 \s”

--\s = 任何空格字符(包括空格、制表符等)。为什么我们在这里需要 s+?


我打了一个简单的例子来检查这个,因为这听起来很奇怪,并且发现不需要添加的加号。使用多个空格分隔单词。其原因很可能是 replaceAll 重复,直到模式与字符串的任何部分都不匹配。
的确。 + 可能会使它对 CPU 更加友好,因为连续的空格是在单个替换操作中处理的,但在这种情况下,这是唯一的区别。确实是 All 而不是 + 替换了字符串中的非连续空格。
它不会删除它(u00A0)
k
kamczak

如果您更喜欢实用程序类而不是正则表达式,那么 Spring 框架的 StringUtils 中有一个方法 trimAllWhitespace(String)


欢迎替代想法。他们会帮助一些人,即使不是所有人。
J
Jonas Elfström

您已经从 Gursel Koca 那里得到了正确的答案,但我相信这很可能不是您真正想做的。如何改为解析键值?

import java.util.Enumeration;
import java.util.Hashtable;

class SplitIt {
  public static void main(String args[])  {

    String person = "name=john age=13 year=2001";

    for (String p : person.split("\\s")) {
      String[] keyValue = p.split("=");
      System.out.println(keyValue[0] + " = " + keyValue[1]);
    }
  }
}

输出:姓名 = 约翰年龄 = 13 年 = 2001


O
OneCricketeer

最简单的方法是使用 commons-lang3 库的 org.apache.commons.lang3.StringUtils 类,例如“commons-lang3-3.1.jar”。

在输入字符串 & 上使用静态方法“StringUtils.deleteWhitespace(String str)”删除所有空格后,它将返回一个字符串。我试过你的示例字符串 "name=john age=13 year=2001" &它返回给我的正是你想要的字符串——“name=johnage=13year=2001”。希望这可以帮助。


A
ArtKorchagin

你可以这样做

String newMysz = mysz.replace(" ","");

令人惊讶的是,在我的情况下,唯一的工人。谢谢。
空格并不总是空格字符。 ;-)
a
avngr
public static void main(String[] args) {        
    String s = "name=john age=13 year=2001";
    String t = s.replaceAll(" ", "");
    System.out.println("s: " + s + ", t: " + t);
}

Output:
s: name=john age=13 year=2001, t: name=johnage=13year=2001

S
Stian Standahl

我正在尝试一个聚合答案,我在其中测试删除字符串中所有空格的所有方法。每种方法运行 100 万次,然后取平均值。注意:一些计算将用于汇总所有运行。

结果:

@jahir 's answer 第一名

带有短文本的 StringUtils:1.21E-4 毫秒(121.0 毫秒)

带有长文本的 StringUtils:0.001648 毫秒(1648.0 毫秒)

第二名

带有短文本的字符串生成器:2.48E-4 ms (248.0 ms)

长文本字符串生成器:0.00566 ms (5660.0 ms)

第三名

带有短文本的正则表达式:8.36E-4 ms (836.0 ms)

带有长文本的正则表达式:0.008877 毫秒(8877.0 毫秒)

第 4 名

短文本循环:0.001666 ms (1666.0 ms)

对于长文本循环:0.086437 ms (86437.0 ms)

这是代码:

public class RemoveAllWhitespaces {
    public static String Regex(String text){
        return text.replaceAll("\\s+", "");
    }

    public static String ForLoop(String text) {
        for (int i = text.length() - 1; i >= 0; i--) {
            if(Character.isWhitespace(text.codePointAt(i))) {
                text = text.substring(0, i) + text.substring(i + 1);
            }
        }

        return text;
    }

    public static String StringBuilder(String text){
        StringBuilder builder = new StringBuilder(text);
        for (int i = text.length() - 1; i >= 0; i--) {
            if(Character.isWhitespace(text.codePointAt(i))) {
                builder.deleteCharAt(i);
            }
        }

        return builder.toString();
    }
}

以下是测试:

import org.junit.jupiter.api.Test;

import java.util.function.Function;
import java.util.stream.IntStream;

import static org.junit.jupiter.api.Assertions.*;

public class RemoveAllWhitespacesTest {
    private static final String longText = "123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222123 123 \t 1adc \n 222";
    private static final String expected = "1231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc2221231231adc222";

    private static final String shortText = "123 123 \t 1adc \n 222";
    private static final String expectedShortText = "1231231adc222";

    private static final int numberOfIterations = 1000000;

    @Test
    public void Regex_LongText(){
        RunTest("Regex_LongText", text -> RemoveAllWhitespaces.Regex(text), longText, expected);
    }

    @Test
    public void Regex_ShortText(){
        RunTest("Regex_LongText", text -> RemoveAllWhitespaces.Regex(text), shortText, expectedShortText);

    }

    @Test
    public void For_LongText(){
        RunTest("For_LongText", text -> RemoveAllWhitespaces.ForLoop(text), longText, expected);
    }

    @Test
    public void For_ShortText(){
        RunTest("For_LongText", text -> RemoveAllWhitespaces.ForLoop(text), shortText, expectedShortText);
    }

    @Test
    public void StringBuilder_LongText(){
        RunTest("StringBuilder_LongText", text -> RemoveAllWhitespaces.StringBuilder(text), longText, expected);
    }

    @Test
    public void StringBuilder_ShortText(){
        RunTest("StringBuilder_ShortText", text -> RemoveAllWhitespaces.StringBuilder(text), shortText, expectedShortText);
    }

    private void RunTest(String testName, Function<String,String> func, String input, String expected){
        long startTime = System.currentTimeMillis();
        IntStream.range(0, numberOfIterations)
                .forEach(x -> assertEquals(expected, func.apply(input)));
        double totalMilliseconds = (double)System.currentTimeMillis() - (double)startTime;
        System.out.println(
                String.format(
                        "%s: %s ms (%s ms)",
                        testName,
                        totalMilliseconds / (double)numberOfIterations,
                        totalMilliseconds
                )
        );
    }
}

h
hichris123
mysz = mysz.replace(" ","");

第一个有空间,第二个没有空间。

然后就完成了。


澄清一下,空格表示 [ \t\n\x0B\f\r]。你只做正常的 [ ] 个空格。
f
fatsoft
String a="string with                multi spaces ";
//or this 
String b= a.replaceAll("\\s+"," ");
String c= a.replace("    "," ").replace("   "," ").replace("  "," ").replace("   "," ").replace("  "," ");

//它适用于任何空格*不要忘记sting b中的空格


非常有用,但不回答发布的问题!
F
FelixSFD

使用mysz.replaceAll("\\s+","");


上面有类似/等于您的建议的答案
G
Gowthaman M

使用 apache string util 类更好地避免 NullPointerException

org.apache.commons.lang3.StringUtils.replace("abc def ", " ", "")

输出

abcdef

J
JB Nizet

\W 表示“非单词字符”。空白字符的模式是 \s。这在 Pattern javadoc 中有详细记录。


这个答案的其余部分在哪里?
u
user27

在java中我们可以做以下操作:

String pattern="[\\s]";
String replace="";
part="name=john age=13 year=2001";
Pattern p=Pattern.compile(pattern);
Matcher m=p.matcher(part);
part=m.replaceAll(replace);
System.out.println(part);

为此,您需要将以下包导入您的程序:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

我希望它会帮助你。


此信息已在您发布答案之前由其他人提供。
f
fredmaggiowski

使用 Pattern And Matcher 更加动态。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RemovingSpace {

    /**
     * @param args
     * Removing Space Using Matcher
     */
    public static void main(String[] args) {
        String str= "jld fdkjg jfdg ";
        String pattern="[\\s]";
        String replace="";

        Pattern p= Pattern.compile(pattern);
        Matcher m=p.matcher(str);

        str=m.replaceAll(replace);
        System.out.println(str);    
    }
}

J
Jemshit Iskenderov

Kotlin 中使用 st.replaceAll("\\s+","") 时,请确保使用 Regex 包装 "\\s+"

"myString".replace(Regex("\\s+"), "")

L
L Joey
import java.util.*;
public class RemoveSpace {
    public static void main(String[] args) {
        String mysz = "name=john age=13 year=2001";
        Scanner scan = new Scanner(mysz);

        String result = "";
        while(scan.hasNext()) {
            result += scan.next();
        }
        System.out.println(result);
    }
}

M
Megawatt

要删除示例中的空格,这是另一种方法:

String mysz = "name=john age=13 year=2001";
String[] test = mysz.split(" ");
mysz = String.join("", mysz);

它的作用是将其转换为以空格为分隔符的数组,然后将数组中的项目组合在一起而没有空格。

它工作得很好,很容易理解。


但是一个非常低效的解决方案。而且,正如您从其他解决方案中看到的那样 - 这仅适用于 " " 空间 - 而不适用于不同类型的空格。
s
satish

有很多方法可以解决这个问题。您可以使用字符串的拆分功能或替换功能。

欲了解更多信息,请参阅 smilliar 问题 http://techno-terminal.blogspot.in/2015/10/how-to-remove-spaces-from-given-string.html


R
Rakesh Chaudhari

字符串中也存在其他空格字符。因此,我们可能需要从字符串中替换空格字符。

例如:NO-BREAK SPACE、3-PER-EM SPACE、PUNCTUATION SPACE

这是空格字符 http://jkorpela.fi/chars/spaces.html 的列表

所以我们需要修改

\u2004 我们为每个 EM 空间提供三个

s.replaceAll("[\u0020\u2004]","")


S
Siva Sanjay Acchana
package com.sanjayacchana.challangingprograms;

public class RemoveAllWhiteSpacesInString {

    public static void main(String[] args) {
        
        String str = "name=john age=13 year=2001";
        
        str = str.replaceAll("\\s", ""); 
        
        System.out.println(str);
        
        
    }

}

这个答案与其他已经存在的答案有何不同?
这对我有用
A
Abdur Rahman

可以使用 Character Class 中的 isWhitespace 函数删除空格。

public static void main(String[] args) {
    String withSpace = "Remove white space from line";
    StringBuilder removeSpace = new StringBuilder();

    for (int i = 0; i<withSpace.length();i++){
        if(!Character.isWhitespace(withSpace.charAt(i))){
            removeSpace=removeSpace.append(withSpace.charAt(i));
        }
    }
    System.out.println(removeSpace);
}

S
Samuel Philipp

将每组文本分成自己的子字符串,然后连接这些子字符串:

public Address(String street, String city, String state, String zip ) {
    this.street = street;
    this.city = city;
    // Now checking to make sure that state has no spaces...
    int position = state.indexOf(" ");
    if(position >=0) {
        //now putting state back together if it has spaces...
        state = state.substring(0, position) + state.substring(position + 1);  
    }
}

S
Samuel Philipp
public static String removeWhiteSpaces(String str){
    String s = "";
    char[] arr = str.toCharArray();
    for (int i = 0; i < arr.length; i++) {
        int temp = arr[i];
        if(temp != 32 && temp != 9) { // 32 ASCII for space and 9 is for Tab
            s += arr[i];
        }
    }
    return s;
}

这可能会有所帮助。


M
Markus

您还可以查看下面的 Java 代码。以下代码不使用任何“内置”方法。

/**
 * Remove all characters from an alphanumeric string.
 */
public class RemoveCharFromAlphanumerics {

    public static void main(String[] args) {

        String inp = "01239Debashish123Pattn456aik";

        char[] out = inp.toCharArray();

        int totint=0;

        for (int i = 0; i < out.length; i++) {
            System.out.println(out[i] + " : " + (int) out[i]);
            if ((int) out[i] >= 65 && (int) out[i] <= 122) {
                out[i] = ' ';
            }
            else {
                totint+=1;
            }

        }

        System.out.println(String.valueOf(out));
        System.out.println(String.valueOf("Length: "+ out.length));

        for (int c=0; c<out.length; c++){

            System.out.println(out[c] + " : " + (int) out[c]);

            if ( (int) out[c] == 32) {
                System.out.println("Its Blank");
                 out[c] = '\'';
            }

        }

        System.out.println(String.valueOf(out));

        System.out.println("**********");
        System.out.println("**********");
        char[] whitespace = new char[totint];
        int t=0;
        for (int d=0; d< out.length; d++) {

            int fst =32;



            if ((int) out[d] >= 48 && (int) out[d] <=57 ) {

                System.out.println(out[d]);
                whitespace[t]= out[d];
                t+=1;

            }

        }

        System.out.println("**********");
        System.out.println("**********");

        System.out.println("The String is: " + String.valueOf(whitespace));

    }
}

输入:

String inp = "01239Debashish123Pattn456aik";

输出:

The String is: 01239123456