将字符串拆分为单个单词 Java

53
我想知道如何将一个较长的字符串拆分成一系列较短的子字符串或单词。 例如:
我想把句子“我想遛狗。”拆分成字符串:“I”,另一个字符串:“want”等。
我该怎么做?

4
请展示一下你尝试过什么(例如,你是否在String文档中查找了“split”一词的信息?) - Jon Skeet
11
是的,String#split() 的命名非常模糊不清 :-P - maksimov
15个回答

86
使用 split() 方法。 例如:
String s = "I want to walk my dog";
String[] arr = s.split(" ");    

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

32
该方法不会从单词中移除逗号、句号等标点符号。 - kazy
文档:https://docs.oracle.com/javase/10/docs/api/java/lang/String.html#split(java.lang.String) - aklingam
但是如何将“foo2bar”拆分为["foo", "2", "bar"]?需要使用正则表达式的简单解决方案。 - user1742529

72

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

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

这个正则表达式意味着分隔符将是任何非单词字符[\W],至少一个字符一组[+]。由于[+]是贪婪的,它将把例如';'和' '一起作为一个分隔符。


8
W似乎只考虑ASCII字母字符,对于带有重音符号的语言不太适用。 - rghome

32

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

\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

请参阅Java API文档的Pattern


1
这会产生空话吗? - Joshua Oliphant
@JoshuaOliphant 如果你在之前使用trim(),那就不会出现这种情况。 - Ahmet Noyan Kızıltan

14

如果您的短语包含带重音符号的字符,请参见我的其他回答

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

4
这是最好的答案。 - rghome
然而,一些变音符号无法处理,例如 فنّى 将被拆分为两个单词。 - Ahmed Ashour

6

另一种方法是使用StringTokenizer

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

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

啊!这在我不需要数组的情况下很好,但是分词器不是返回一个令牌数组吗?不过这个想法不错。 - Coding Enthusiast
不,没有任何数组被生成。StringTokenizer在字符串中查找连续的标记,并逐个返回它们。 - Kao
1
好的解决方案,不幸的是,StringTokenizer不应再使用。从文档中可以看出: StringTokenizer是一个遗留类,为了保持兼容性而保留,尽管在新代码中不建议使用它。建议任何寻求此功能的人改用String的split方法或java.util.regex包。 - Tomor

4
为了包括单词之间的分隔符(例如除了所有小写字母和大写字母之外的所有内容),我们可以这样做:
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],至少一个字符为一组[+]


2
你可以使用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]);
}

2

这个正则表达式将通过空格、制表符和换行符来分隔单词:

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

1
你可以使用Apache Commons的StringUtils类。
String[] partsOfString = StringUtils.split("I want to walk my dog", StringUtils.SPACE)

1

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);  
            }  
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接