Java(Regex) - 获取句子中的所有单词

时间:2013-01-26 17:22:33

标签: java regex string split

我需要将一个java字符串拆分成一个单词数组。让我们说字符串是:

"Hi!! I need to split this string, into a serie's of words?!"

目前我尝试使用此String[] strs = str.split("(?!\\w)"),但它会保留符号,例如!在数组中,它还保留了像#34; Hi!"在数组中也是如此。我分裂的字符串将始终为小写。我希望生成的数组看起来像: {"hi", "i", "need", "to", "split", "this", "string", "into", "a", "serie's", "of", "words"} - 请注意保留撇号。

我怎样才能将我的正则表达式更改为不包含数组中的符号?

道歉,我会将一个单词定义为一系列字母数字字符,但使用'如果字符在上面的上下文中,例如"它"",如果它用于引用诸如"''''&# 34 ;.此外,在这种情况下"嗨,"或者" hi-person"不是单词而是" hi"和"人"是。我希望澄清这个问题。

7 个答案:

答案 0 :(得分:9)

您可以删除所有?!符号,然后将其拆分为单词

str = str.replaceAll("[!?,]", "");
String[] words = str.split("\\s+");

结果:

Hi, I, need, to, split, this, string, into, a, serie's, of, words

答案 1 :(得分:3)

应该为你想要的东西工作。

String line = "Hi!! I need to split this string, into a serie's of words?! but not '' or ''' word";
String regex = "([^a-zA-Z']+)'*\\1*";
String[] split = line.split(regex);
System.out.println(Arrays.asList(split));

给出

[Hi, I, need, to, split, this, string, into, a, serie's, of, words, but, not, or, word]

答案 2 :(得分:2)

如果将单词定义为非空白字符序列(由\s定义的空白字符),则可以沿空格字符分割:

str.split("\\s+")

请注意,";.';.@#$>?>@4""very,bad,punctuation""'goodbye'"是上述定义下的字词。

然后另一种方法是将一个单词定义为一组允许的字符中的字符序列。如果您想允许a-zA-Z'作为单词的一部分,您可以将其他所有内容分开:

str.split("[^a-zA-Z']+")

但仍然可以将"''''''"定义为单词。

答案 3 :(得分:0)

您可以过滤掉您认为是“非单词”字符的字符:

String[] strs = str.split("[,!? ]+");

答案 4 :(得分:0)

我会使用str.split("[\\s,?!]+")。您可以在括号[]内添加要拆分的任何字符。

答案 5 :(得分:0)

所以你想要的是分裂任何不是字符[a-zA-Z]的东西,而不是' 这个正则表达式将执行“[^ a-zA-Z'] \ s ” 如果字符串包含在“

中引用的引号,则会出现问题

我通常使用此页面来测试我的正则表达式' http://www.regexplanet.com/advanced/java/index.html

答案 6 :(得分:0)

myString.replaceAll("[^a-zA-Z'\\s]","").toLowerCase().split("\\s+");

replaceAll("[^a-zA-Z'\\s]","")方法替换所有不是a-zA-Z'whitespace的所有字符("")和然后toLowerCase方法使所有字符从replaceAll方法小写返回。最后,我们根据空白字符split输入字符串。更具可读性;

myString = myString.replaceAll("[^a-zA-Z'\\s]","");
myString = myString.toLowerCase();
String[] strArr = myString.split("\\s+");