6

我需要将一个 java 字符串拆分为一个单词数组。假设字符串是:

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

目前我正在尝试使用它String[] strs = str.split("(?!\\w)"),但是它保留了诸如!在数组中,它还保留诸如“Hi!”之类的字符串。在数组中也是如此。我要拆分的字符串总是小写的。我想要的是生成一个如下所示的数组: {"hi", "i", "need", "to", "split", "this", "string", "into", "a", "serie's", "of", "words"}- 请注意保留撇号。

如何更改我的正则表达式以不包含数组中的符号?

抱歉,我会将一个单词定义为仅由字母数字字符组成的序列,但如果它在上述上下文中,例如“it's”,则包含 ' 字符,而不是用于引用诸如“'its'”之类的单词. 此外,在这种情况下,“hi”或“hi-person”不是单词,但“hi”和“person”是。我希望能澄清这个问题。

4

7 回答 7

10

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

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

结果:

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

于 2013-01-26T17:40:49.817 回答
4

Should work for what you want.

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

Gives

[Hi, I, need, to, split, this, string, into, a, serie's, of, words, but, not, or, word]
于 2013-01-26T18:45:13.660 回答
2

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

str.split("\\s+")

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

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

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

不过,这仍然允许"''''''"被定义为一个词。

于 2013-01-26T17:27:38.347 回答
1

所以你想要的是拆分任何不是单词字符 [a-zA-Z] 并且不是 ' 这个正则表达式会这样做 "[^a-zA-Z'] \s " 如果该字符串包含在 ' 中引用的引号

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

于 2013-01-26T17:33:39.847 回答
0

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

String[] strs = str.split("[,!? ]+");
于 2013-01-26T17:30:48.220 回答
0

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

于 2013-01-26T17:33:06.270 回答
0
myString.replaceAll("[^a-zA-Z'\\s]","").toLowerCase().split("\\s+");

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

myString = myString.replaceAll("[^a-zA-Z'\\s]","");
myString = myString.toLowerCase();
String[] strArr = myString.split("\\s+");
于 2013-01-26T17:36:18.950 回答