【问题标题】:Split string into individual words Java将字符串拆分为单个单词 Java
【发布时间】:2012-07-30 16:52:11
【问题描述】:

我想知道如何将一个大字符串拆分为一系列较小的字符串或单词。 例如:

我想遛狗。

我想要一个字符串:"I", 另一个字符串:"want"

我该怎么做?

【问题讨论】:

  • 请显示您尝试过的什么(例如,您是否在文档中寻找字符串的“split”一词?)
  • 是的,String#split() 的命名非常含糊:-P

标签: java


【解决方案1】:

使用split()方法

例如:

String s = "I want to walk my dog";
String[] arr = s.split(" ");    

for ( String ss : arr) {
    System.out.println(ss);
}

【讨论】:

【解决方案2】:

作为更通用的解决方案(但仅限 ASCII!),在单词之间包含任何其他分隔符(如逗号和分号),我建议:

String s = "I want to walk my dog, cat, and tarantula; maybe even my tortoise.";
String[] words = s.split("\\W+");

正则表达式意味着分隔符将是任何不是单词 [\W] 的内容,至少包含一个 [+]。因为 [+] 是贪婪的,所以它会采用例如 ';'和 ' ' 一起作为一个分隔符。

【讨论】:

  • \\W 似乎只考虑 ASCII 字母字符。它不适合带有口音的语言。
【解决方案3】:

正则表达式也可以用来分割单词。

\w 可用于匹配单词字符([A-Za-z0-9_]),从而将标点符号从结果中移除:

String s = "I want to walk my dog, and why not?";
Pattern pattern = Pattern.compile("\\w+");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
    System.out.println(matcher.group());
}

输出:

I
want
to
walk
my
dog
and
why
not

请参阅Pattern 的 Java API 文档

【讨论】:

  • 这会产生空话吗?
  • @JoshuaOliphant 如果您之前使用 trim() 则不会。
【解决方案4】:

如果您的短语包含重音字符,请查看我的other answer

String[] listeMots = phrase.split("\\P{L}+");

【讨论】:

  • 这是最好的答案。
  • 但是,有些变音符号没有被处理,例如فنّى 将被拆分成两个词。
【解决方案5】:

另一种方法,使用StringTokenizer

String s = "I want to walk my dog";
StringTokenizer tokenizer = new StringTokenizer(s);

while(tokenizer.hasMoreTokens()) {
    System.out.println(tokenizer.nextToken());
}

【讨论】:

  • 啊!这在我不需要数组但标记器不返回标记数组的情况下很好吗?不过好主意
  • 不,没有任何数组正在生成。 StringTokenizer 查找字符串中的连续标记,并一一返回。
  • 不错的解决方案,不幸的是,不应再使用 StringTokenizer。来自 Docs:StringTokenizer 是一个遗留类,出于兼容性原因保留,但不鼓励在新代码中使用它。建议任何寻求此功能的人使用 String 的 split 方法或 java.util.regex 包。
【解决方案6】:

要在单词之间包含任何分隔符(就像除了所有小写和大写字母之外的所有内容),我们可以这样做:

String mystring = "hi, there,hi Leo";
String[] arr = mystring.split("[^a-zA-Z]+");
for(int i = 0; i < arr.length; i += 1)
{
     System.out.println(arr[i]);
}

这里的正则表达式意味着分隔符将是任何不是大写或小写字母[^a-zA-Z],至少一组[+]。

【讨论】:

    【解决方案7】:

    您可以使用String 类的split(" ") 方法,并可以得到每个单词,代码如下:

    String s = "I want to walk my dog";
    String []strArray=s.split(" ");
    for(int i=0; i<strArray.length;i++) {
         System.out.println(strArray[i]);
    }
    

    【讨论】:

      【解决方案8】:

      使用split()

      String words[] = stringInstance.split(" ");
      

      【讨论】:

      • 请通过答案链接
      【解决方案9】:

      此正则表达式将按空格分割单词,如空格、制表符、换行符:

      String[] str = s.split("\\s+");
      

      【讨论】:

        【解决方案10】:
        StringTokenizer separate = new StringTokenizer(s, " ");
        String word = separate.nextToken();
        System.out.println(word);
        

        【讨论】:

          【解决方案11】:

          你可以使用 Apache commons 的 StringUtils 类

          String[] partsOfString = StringUtils.split("I want to walk my dog", StringUtils.SPACE)
          

          【讨论】:

            【解决方案12】:

            Java String split() 方法示例

             public class SplitExample{  
                    public static void main(String args[]){  
                        String str="java string split method";  
                        String[] words=str.split("\\s");//splits the string based on whitespace  
                 
                        for(String word:words){  
                            System.out.println(word);  
                        }  
                    }
                }
            

            【讨论】:

              【解决方案13】:
              class test{
                         
                  public static void main(String[] args){
                              StringTokenizer st= new StringTokenizer("I want to walk my dog.");
                              
                              while (st.hasMoreTokens())
                                  System.out.println(st.nextToken());
                       
                          }
                      }
              

              【讨论】:

                【解决方案14】:
                String[] str = s.split("[^a-zA-Z]+");
                

                【讨论】:

                • 你自己的模式匹配通常不是最好的方法;使用已经这样做的人的解决方案,并考虑到您在撰写本文时没有想到的所有奇怪的极端案例。另外,根据经验,我宁愿在这里使用空白字符的白名单,而不是在您错过变音符号等时尝试匹配单词。
                猜你喜欢
                • 1970-01-01
                • 2011-06-12
                • 2022-01-18
                • 1970-01-01
                • 2014-06-09
                • 2011-10-23
                • 2011-11-03
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多