【问题标题】:Count the number of dots[.] , ! and ? in a text计算点数[.] , !和 ?在文本中
【发布时间】:2026-02-13 16:35:01
【问题描述】:

我正在做 java 项目,我需要计算点的数量,!和 ?在一个字符串中。我目前的方法是使用正则表达式。我使用了以下代码,但它没有给出正确的结果。

for(int i=0; i<words.length; i++){
        String w = words[i];
        if(w.matches("(.)+[.!?]")){
            count++;    //increasing the count.
        }
    }

对于其他一些函数,我已将字符串转换为单词数组。所以我在这个中使用它。
我想为每个点的出现增加一个计数,!或者 ?表示句子的结束点。例如

测试。 - 计数增加 1
测试.. - 计数增加 1
测试?。 - 计数增加 1

重复使用符号不应增加计数。
你能告诉我这里有什么问题吗?

【问题讨论】:

  • 你认为[(.)+[.!?]] 匹配什么,你为什么这么认为?
  • @SotiriosDelimanolis 我查看了一些关于正则表达式的教程,这就是我想出的。 (.)+[.!?] 表示(任意数量的字符)(一个.!?)不是这样吗?我在发布的代码上犯了一个错误,我对其进行了编辑
  • 有人能告诉我为什么这被否决了吗??

标签: java regex string


【解决方案1】:

在正则表达式中使用通配符。

    int count = 0;

    for( int i = 0; i < words.length; i++ )
        if( words[i].matches(".*[.!?]") )
            count++;    

.*[.!?] 将匹配所有以句点、感叹号或问号结尾的字符串。

第一个. 未转义,代表任何字符。 * 表示前面的 0 个或多个。所以0个或更多的任何字符。括号中的. 被转义,所以它只是一个常规句点。

【讨论】:

  • 点是指单词末尾的点,表示句子的结尾。对于我的工作,我需要像 test... 这样的词只计算一次。
  • 它抛出一个异常。线程“主”java.util.regex.PatternSyntaxException 中的异常:索引 0 *[.!?] 附近的元字符“*”悬空
  • @isuru-buddhika 抱歉,我忘记了句号。忘了这不是 Linux 命令行...大声笑。这次我测试了它,所以我知道它有效。
  • 我使用 (".+[.!?]") 不是很有意义吗?给出 1 个或多个任意字符 + 一个。 ! ?
  • @isuru-buddhika 没关系。我只是不知道您是否需要至少一封信。
【解决方案2】:

最简单的方法是这种单线:

int count = str.length() - str.replaceAll("[.!?]+", "").length()

而不是计算字符匹配,删除它们并比较长度。

【讨论】:

  • 虽然不多,但没有人认为这个答案会吐在表演脸上吗?做一个简单的任务,让它消耗内存和时间......不喜欢。
  • 这个是空字符串安全的,.match 向我抛出了一个错误。 ty
【解决方案3】:

你可以做-

public static void main(String args[])
{
    String str = "Test, test!.\tTEST:\nTeST?;";
    Pattern p = Pattern.compile("[.!?]");
    Matcher matcher = p.matcher(str);
    int count = 0;
    while(matcher.find()) {
        count++;
    }
    System.out.println("Count : " + count);

}

如预期的那样,输出为 - 3

你能告诉我为什么 str.matches("[.!?]) 中的同一个正则表达式没有给出预期的结果吗?

因为str.matches("[.!?]) 匹配整个字符串,而不是如果在字符串中找到正则表达式。如果字符串是 '.'、'?' 或 '!',上述正则表达式将起作用-

    String s = ".";
    System.out.println(s.matches("[.!?]"));

会给true

【讨论】:

  • 你能告诉我为什么 str.matches("[.!?]) 中的同一个正则表达式没有给出预期的结果吗?
  • 因为您的字符串与正则表达式 [.!?] 不匹配。更新了答案。
  • 这些词中的一些不应该返回 true 吗?