gpt4 book ai didi

java - 多种正则表达式模式可供查找。 java

转载 作者:行者123 更新时间:2023-11-30 06:10:32 26 4
gpt4 key购买 nike

我需要分别计算字符串中的单词和句子的数量,我有这两种工作正常的方法:

    Pattern pattern = Pattern.compile("\\w+\\s|\\w+\\,|\\w+\\.|\\w+\\?|\\w+\\!*$");
Matcher match1 = pattern.matcher(s);
while(match1.find()) {
counterWords++;
}

对于句子:

    Pattern pattern = Pattern.compile("[^?!.][?!.]");
Matcher match2 = pattern.matcher(s);
while(match2.find()) {
counterSentences++;
}

下一个任务是再次计算它,但在一个循环中,所以我尝试了:

while(match1.find() || match2.find()){
if(match1.find()){
counterWords++;
}
if(match2.find()){
counterSentences++;
}

但是,该方法无法正常工作,它可以正确计算句子,但字数计数器比实际字数少 2 倍。我很可能不完全理解 matcher.find() 的工作原理,有人可以解释我做错了什么吗?谢谢。

最佳答案

要使用单个循环解决此问题,您需要匹配器查找单词或句尾标记,然后告诉您它找到了哪些。这可以使用“捕获组”来完成。

    String s = "Hello, user.  How many words and sentences are there?  Count them!";

int words = 0;
int sentences = 0;
Pattern pattern = Pattern.compile("(\\w+)|([.?!])");
Matcher matcher = pattern.matcher(s);

while(matcher.find()) {
if (matcher.group(1) != null)
words++;
else if (matcher.group(2) != null)
sentences++;
}

System.out.printf("%d words and %d sentences%n", words, sentences);

11 words and 3 sentences

正则表达式解释:

(\w+)|([.?!]) - 将 \\ 转换为 \
(___)________ - 捕获组#1。
_\w+_________ - 一个或多个单词字符。
_____|_______ - 匹配表达式的第一部分或第二部分。
______(_____) - 捕获组#2。
_______[.?!]_ - 句子终止符。

第一次调用 matcher.find() 将匹配 Hello,并将其记录为捕获组 #1。下一个调用将跳过逗号和空格并匹配 user,再次将其记录为捕获组 #1。第三次调用与正则表达式第二部分中的句点 (.) 匹配,将其记录为捕获组 #2。这一直持续到匹配感叹号 (!)。下一次调用 matcher.find() 返回 false,因为找不到更多匹配项。

if 语句检查是否填充了组 #1 或组 #2 捕获,从而确定是否遇到单词或句子终止符。

关于java - 多种正则表达式模式可供查找。 java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50336372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com