【问题标题】:How to split a String by space如何按空格分割字符串
【发布时间】:2011-12-15 12:26:25
【问题描述】:

我需要用空格分割我的字符串。 为此,我尝试了:

str = "Hello I'm your String";
String[] splited = str.split(" ");

但它似乎不起作用。

【问题讨论】:

  • 看起来不错...“拆分”数组中的值是什么?
  • 您的代码确实可以按原样工作。见code run live at IdeOne.com
  • @BasilBourque - 我在那个链接上找不到任何运行按钮
  • @nanosoft IdeOne.com 的页面在加载时会自动运行。请参阅 stdout 部分中代码下方的输出。要更改代码,请单击左上角附近的fork 链接。

标签: java string split arrays


【解决方案1】:

char 用单引号代替双引号

String[] 分割 = str.split(' ');

【讨论】:

    【解决方案2】:

    你所拥有的应该可以工作。但是,如果提供的空间默认为...其他?您可以使用空格正则表达式:

    str = "Hello I'm your String";
    String[] splited = str.split("\\s+");
    

    这将导致任意数量的连续空格将您的字符串拆分为标记。

    【讨论】:

    • 如果我们必须在这些空间上分割使用什么正则表达式,+ - / ;
    • 我不确定。如果它只是空间,您可以通过将其括起来来形成自己的类,因此在您的情况下可能(注意,这是未经测试的)[ +\\-/;]+ - 请注意 \` around the -` 来转义它。现在,这可能会将This is+a+ - + - + - test 匹配为 4 个标记,这可能是也可能不是。真正的问题是你不能使用\\s 来匹配“任何空白”。您最好不要使用拆分,而只使用Matcher m = Pattern.compile("([A-Za-z0-9]+)").matcher(text); while(m.find()) list.add(m.group(1)); 来获取单词而不是拆分大文本。
    • @FarazAhmad 请注意,这些只是我的想法,可能有小错误,所以不要复制/粘贴该评论中的代码:)
    • string.split("\\s+")[0] - 只获取第一部分
    • 我发现它很有用,因为我的用例是拆分字符串并删除多个空格。一行代码对我来说都可以。
    【解决方案3】:

    将解决方案合二为一!

    public String getFirstNameFromFullName(String fullName){
        int indexString = fullName.trim().lastIndexOf(' ');
        return (indexString != -1)  ? fullName.trim().split("\\s+")[0].toUpperCase() : fullName.toUpperCase();
    }
    

    【讨论】:

      【解决方案4】:

      虽然接受的答案很好,但请注意,如果您的输入字符串以空格开头,您最终会得到一个前导的空字符串。例如:

      String str = " Hello I'm your String";
      String[] splitStr = str.split("\\s+");
      

      结果将是:

      splitStr[0] == "";
      splitStr[1] == "Hello";
      splitStr[2] == "I'm";
      splitStr[3] == "Your";
      splitStr[4] == "String";
      

      所以你可能想在拆分之前修剪你的字符串:

      String str = " Hello I'm your String";
      String[] splitStr = str.trim().split("\\s+");
      

      [编辑]

      除了 trim 警告之外,您可能还需要考虑 unicode 不间断空格字符 (U+00A0)。这个字符就像字符串中的常规空格一样打印,并且经常潜伏在来自富文本编辑器或网页的复制粘贴文本中。它们不是由.trim() 处理的,它使用c <= ' ' 测试要删除的字符; \s 也不会抓住他们。

      相反,您可以使用 \p{Blank},但您还需要启用 unicode 字符支持,而常规 split 不会这样做。例如,这将起作用:Pattern.compile("\\p{Blank}", UNICODE_CHARACTER_CLASS).split(words),但它不会执行 trim 部分。

      以下演示了该问题并提供了解决方案。 依赖正则表达式来解决这个问题,但现在 Java 有 8 位 / 16 位字节表示,一个有效的解决方案变得相当长。

      public class SplitStringTest
      {
          static final Pattern TRIM_UNICODE_PATTERN = Pattern.compile("^\\p{Blank}*(.*)\\p{Blank}$", UNICODE_CHARACTER_CLASS);
          static final Pattern SPLIT_SPACE_UNICODE_PATTERN = Pattern.compile("\\p{Blank}", UNICODE_CHARACTER_CLASS);
      
          public static String[] trimSplitUnicodeBySpace(String str)
          {
              Matcher trimMatcher = TRIM_UNICODE_PATTERN.matcher(str);
              boolean ignore = trimMatcher.matches(); // always true but must be called since it does the actual matching/grouping
              return SPLIT_SPACE_UNICODE_PATTERN.split(trimMatcher.group(1));
          }
      
          @Test
          void test()
          {
              String words = " Hello I'm\u00A0your String\u00A0";
              // non-breaking space here --^ and there -----^
      
              String[] split = words.split(" ");
              String[] trimAndSplit = words.trim().split(" ");
              String[] splitUnicode = SPLIT_SPACE_UNICODE_PATTERN.split(words);
              String[] trimAndSplitUnicode = trimSplitUnicodeBySpace(words);
      
              System.out.println("words: [" + words + "]");
              System.out.println("split: [" + Arrays.stream(split).collect(Collectors.joining("][")) + "]");
              System.out.println("trimAndSplit: [" + Arrays.stream(trimAndSplit).collect(Collectors.joining("][")) + "]");
              System.out.println("splitUnicode: [" + Arrays.stream(splitUnicode).collect(Collectors.joining("][")) + "]");
              System.out.println("trimAndSplitUnicode: [" + Arrays.stream(trimAndSplitUnicode).collect(Collectors.joining("][")) + "]");
          }
      }
      

      结果:

      words: [ Hello I'm your String ]
      split: [][Hello][I'm your][String ]
      trimAndSplit: [Hello][I'm your][String ]
      splitUnicode: [][Hello][I'm][your][String]
      trimAndSplitUnicode: [Hello][I'm][your][String]
      

      【讨论】:

      • 感谢您的详细回答。由于前导和尾随空格,我遇到了异常。
      【解决方案5】:

      不仅是空白,我的解决方案也解决了不可见字符。

      str = "Hello I'm your String";
      String[] splited = str.split("\p{Z}");
      

      【讨论】:

        【解决方案6】:

        下面的非常简单的例子:

        希望对你有帮助。

        String str = "Hello I'm your String";
        String[] splited = str.split(" ");
        var splited = str.split(" ");
        var splited1=splited[0]; //Hello
        var splited2=splited[1]; //I'm
        var splited3=splited[2]; //your
        var splited4=splited[3]; //String
        

        【讨论】:

          【解决方案7】:

          自从这些答案发布以来已经有一段时间了,这里有另一种更新的方式来完成所要求的事情:

          List<String> output = new ArrayList<>();
          try (Scanner sc = new Scanner(inputString)) {
              while (sc.hasNext()) output.add(sc.next());
          }
          

          现在你有了一个字符串列表(可以说它比数组更好);如果你确实需要一个数组,你可以这样做output.toArray(new String[0]);

          【讨论】:

            【解决方案8】:

            你可以使用下面的代码来区分字符串

               String thisString="Hello world";
            
               String[] parts = theString.split(" ");
            
               String first = parts[0];//"hello"
            
                String second = parts[1];//"World"
            

            【讨论】:

              【解决方案9】:

              我确实相信在 str.split 括号中放置正则表达式应该可以解决问题。 Java String.split() 方法基于正则表达式,因此您需要的是:

              str = "Hello I'm your String";
              String[] splitStr = str.split("\\s+");
              

              【讨论】:

                【解决方案10】:

                这是一种修剪带有“,”或空格的字符串的方法

                private String shorterName(String s){
                        String[] sArr = s.split("\\,|\\s+");
                        String output = sArr[0];
                
                        return output;
                    }
                

                【讨论】:

                  【解决方案11】:

                  好的,所以我们必须进行拆分,因为您已经得到了我会概括的答案。

                  如果你想用空格分割任何字符串,分隔符(特殊字符)。

                  首先,删除前导空格,因为它们会造成大多数问题。

                  str1 = "    Hello I'm your       String    ";
                  str2 = "    Are you serious about this question_  boy, aren't you?   ";
                  

                  首先删除前导空格,可以是空格,制表符等。

                  String s = str1.replaceAll("^\\s+","");//starting with whitespace one or more
                  

                  现在,如果您想按空格或任何特殊字符分割。

                  String[] sa = s.split("[^\\w]+");//split by any non word char
                  

                  但由于 w 包含 [a-zA-Z_0-9] ,所以如果你想用下划线(_)分割也使用

                   String[] sa = s.split("[!,? ._'@]+");//for str2 after removing leading space
                  

                  【讨论】:

                  • replaceAll("^\\s+","") 拯救了我的一天。这对我的情况有用。谢谢
                  【解决方案12】:

                  简单的按空格吐出字符串

                      String CurrentString = "First Second Last";
                      String[] separated = CurrentString.split(" ");
                  
                      for (int i = 0; i < separated.length; i++) {
                  
                           if (i == 0) {
                               Log.d("FName ** ", "" + separated[0].trim() + "\n ");
                           } else if (i == 1) {
                               Log.d("MName ** ", "" + separated[1].trim() + "\n ");
                           } else if (i == 2) {
                               Log.d("LName ** ", "" + separated[2].trim());
                           }
                       }
                  

                  【讨论】:

                    【解决方案13】:

                    试试这个

                        String str = "This is String";
                        String[] splited = str.split("\\s+");
                    
                        String split_one=splited[0];
                        String split_second=splited[1];
                        String split_three=splited[2];
                    
                       Log.d("Splited String ", "Splited String" + split_one+split_second+split_three);
                    

                    【讨论】:

                      【解决方案14】:

                      如果你不想使用 String split 方法,那么你可以在 Java 中使用 StringTokenizer 类作为..

                          StringTokenizer tokens = new StringTokenizer("Hello I'm your String", " ");
                          String[] splited = new String[tokens.countTokens()];
                          int index = 0;
                          while(tokens.hasMoreTokens()){
                              splited[index] = tokens.nextToken();
                              ++index;
                          }
                      

                      【讨论】:

                      • 有可能抛出 ArrayIndexOutofBounds 异常。
                      • 不,这不会抛出“ArrayIndexOutofBounds”,因为我已经根据字符串中找到的标记数声明了数组大小。这将确保数组大小不会超过字符串中接收到的标记。
                      【解决方案15】:

                      另一种方法是:

                      import java.util.regex.Pattern;
                      
                      ...
                      
                      private static final Pattern SPACE = Pattern.compile(" ");
                      String[] arr = SPACE.split(str); // str is the string to be split
                      

                      看到了here

                      【讨论】:

                        【解决方案16】:

                        使用Stringutils.split() 将字符串按白色步长分割。例如StringUtils.split("Hello World") 返回“Hello”和“World”;

                        为了解决上述情况,我们使用这样的拆分方法

                        String split[]= StringUtils.split("Hello I'm your String");
                        

                        当我们打印分割数组时,输出将是:

                        你好

                        我是

                        你的

                        字符串

                        For complete example demo check here

                        【讨论】:

                          【解决方案17】:

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2013-10-11
                            • 1970-01-01
                            • 1970-01-01
                            • 2010-09-24
                            • 1970-01-01
                            • 2021-10-05
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多