我有一个字符串,它有一个带有撇号的单词。他是个非常非常好的男孩,不是吗?
public class Solution {
public static void main(String[] args) {
String s = "He is a very very good boy, isn't he?";
String[] words = s.split("\s+");
int itemCount = words.length;
System.out.println(itemCount);
for (int i = 0; i < itemCount; i++) {
String word = words[i];
System.out.println(word);
}
}
}
我得到的输出是9个单词。但是我想要计数为10,通过把它分开,而不是2个单词。如何使用上面的正则表达式?
使用w
结构会更可靠:
Pattern p = Pattern.compile("(\w)+");
Matcher m = p.matcher("He is a very very good boy, isn't he?");
while (m.find()) {
System.out.println(m.group(0));
}
否则,你需要手动处理太多的情况,例如:"他是一个非常好的男孩。不是吗?"。 您可以尝试使用p{Punct},它会忽略像?!
String s = "He is a very very good boy, isn't he?";
String[] words = s.split("[\p{Punct}\s]+");
int itemCount = words.length;
System.out.println(itemCount);
for (int i = 0; i < itemCount; i++) {
String word = words[i];
System.out.println(word);
}
对非单词字符进行分割:
String[] words = s.split("\W+")
我认为你想让isn't
成为is not
,所以把它们算作两个独立的单词,而不是一个。
在分割正则表达式中可以有或 (|
),
\s+|'t
这只适用于't
,它将避免计算像my friend's birthday..
这样的句子,这里不应该考虑另一个单词的撇号。
但这不仅仅是故事的结尾。在这个表达式中还有许多其他的缩略形式需要考虑。
。
- ' t :不是,不是,不是,不是,不是,没等。
- 's: it's, that's, etc.(这个很难)
- 'd: I'd, you'd等
- 'll:我会,他们会等。…
所以最终遵循正则表达式将解决90%的单词计数问题。
\s+|'t|'d|'ll
's
(撇号S)的问题是,它与Dog's, Cat's等主题一起出现,这表明它们不应该被视为两个单独的单词。在另一端,有时我们使用's
来写It is, That is(That's, It's)等。您可以在现有正则表达式中添加表达式,以区分缩写和表示占有的撇号。
注意:这只是用于计算单词,它会将isn't
拆分为isn
和(space), CC_12将被删除。