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

时间:2016-08-20 06:29:59

标签: java regex

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

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

输出I&#39;得到的是9个单词。但我希望将数量计算为10,将isn&t; t分为2个单词。如何使用上面的正则表达式?

4 个答案:

答案 0 :(得分:1)

使用\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));
}

否则,你需要手动处理太多情况,例如:“他是一个非常好的男孩。不是吗?”。

答案 1 :(得分:0)

我认为您希望isn'tis not,因此将它们视为2个单独的单词,而不是单个单词。

您可以在拆分正则表达式中使用|),

\\s+|'t

这仅适用于't,并且它将避免计算my friend's birthday..之类的句子,此处撇号不应被视为另一个词。

但这不仅仅是故事的结局。在这种表达中应该考虑很多其他的收缩。

  • &#39; :不是,不是,不是,不是,不会,不是,没有。等等。
  • &#39; :它,等等(这很难)
  • &#39; d :我,你,等等。
  • &#39; ll :我和他们等等 ...

因此,最终遵循正则表达式将解决90%的问题计数词。

\\s+|'t|'d|'ll

's(撇号S)的问题是它带有像狗,猫等主题,表示占有,这些不应被视为两个单独的词。另一方面,有一段时间我们使用's来编写它是,那就是(那,&#39; s )等。你可以在现有的常规中添加表达式用于区分收缩和表示占有的撇号的表达。

注意:这仅用于计算单词,它会将isn't分为isn空格),'t将被删除。

答案 2 :(得分: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);
        }

答案 3 :(得分:0)

拆分非单词字符:

String[] words = s.split("\\W+")