如何使用Java正则表达式将带有撇号的单词计数为两个单独的单词



我有一个字符串,它有一个带有撇号的单词。他是个非常非常好的男孩,不是吗?

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将被删除。

最新更新