Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java正则表达式将带有撇号的单词计算为两个单独的单词_Java_Regex - Fatal编程技术网

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

如何使用Java正则表达式将带有撇号的单词计算为两个单独的单词,java,regex,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

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

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);
           }
     }
}
公共类解决方案{
公共静态void main(字符串[]args){
String s=“他是一个非常非常好的男孩,不是吗?”;
字符串[]字=s.split(\\s+);
int itemCount=words.length;
系统输出打印项数(itemCount);
对于(int i=0;i

我得到的输出是9个单词。但我希望计数为10,因为分开不是两个字。如何使用上面的正则表达式

我想你希望
不是
不是
,所以把它们算作两个独立的单词,而不是一个

在拆分正则表达式中可以有或(
|

\\s+|'t
这只适用于
't
,它将避免像
我朋友的生日这样的句子。
这里撇号不应被视为另一个单词

但这不仅仅是故事的结局。在这种表达中,还有许多其他的收缩现象需要考虑。

i、 e

  • 't:不是,不是,不是,不是,不是,不会,没有等
  • :是,那是,等等(这是一个困难的问题)
  • 'd:我愿意,你愿意等等
  • 'll:我会的,他们会的,等等。
所以,最终遵循正则表达式将解决90%的单词计数问题

\\s+|'t|'d|'ll
(撇号s)的问题是它带有主题,如Dog's、Cat's等,表示拥有,不应将其视为两个单独的单词。另一方面,有时我们使用
来编写它,即(即,它)等。您可以在现有正则表达式中添加表达式,以区分收缩和表示占有的撇号


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

使用
\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 s=“他是一个非常非常好的男孩,不是吗?”;
String[]words=s.split([\\p{Punct}\\s]+”;
int itemCount=words.length;
系统输出打印项数(itemCount);
对于(int i=0;i
在非单词字符上拆分:

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

使用交替选项:-
String[]words=s.split(\\s+|')
向上面的评论添加了提示,但是您确定要将
不是
变成
t
?@rock321987 Ok。我如何指定逗号(,)问号(?)等。如果我用|来声明它们,它将作为一个单词计数,并且单词计数正在增加。@Progator你能详细说明一下吗?提供一些example@rock321987在上面的字符串“他是一个非常非常好的男孩,不是吗?”中,单词计数应该是10,我想省略逗号和问号。就像这样——他是一个非常非常好的男孩,不是吗。我怎么能省略?等在句子中使用或(|)在同一个表达中?@主角:是这样吗?那么请不要在评论中再提出新问题。你的补充问题似乎与原来的问题无关。那么我该如何计算字数呢?在上面的示例字符串中,计数应为10
Matcher
is lazy(出于性能原因)。在你要求之前,它不会找到所有匹配项。因此,找到匹配项计数的唯一方法是迭代并手动计数。如果您需要在单词之前打印计数,只需在计数时将单词收集到列表中,然后打印列表即可。如果您经常需要此逻辑,只需使用此逻辑在
Matcher
周围创建一个包装器即可too@Protagonist
int count=words.length