2015-02-08 64 views
1

我的工作在Java项目,我需要计算的点数,!和?在一个字符串中。我目前的做法是使用正则表达式。我使用了下面的代码,但没有给出正确的结果。计算点数[。],!和?在一个文本

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

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

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

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

+1

你觉得呢'[()。!?+ []'比赛,你为什么这么认为 – 2015-02-08 05:08:44

+0

@SotiriosDelimanolis我查了一些正则表达式和教程(。)+ [。!?]的意思是(任意数量的字符)(其中一个!!?)不是这样吗? 我在发布的代码上犯了一个错误,我编辑了它 – 2015-02-08 05:12:04

+0

有人可以告诉我为什么这个投票结果不是这样吗? – 2015-02-08 05:16:22

回答

2

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

int count = 0; 

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

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

第一个.是非转义的,代表任何字符。 *意味着以前的0或更多的事情。所以0或更多的任何字符。括号内的.已被转义,所以它只是一个固定的时期。

+0

By点我的意思是在t点他结束了一个表示句子结束的单词。对于我的工作,我将需要像测试这样的词......只计算一次。 – 2015-02-08 05:24:25

+0

@ isuru-buddhika改变了我的代码。 – Kacy 2015-02-08 05:32:06

+0

它引发异常。 线程“主”异常java.util.regex.PatternSyntaxException:在索引0附近悬挂元字符'*' * [。!?] – 2015-02-08 05:42:23

0

最简单的方法是这样的一行代码:

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

而不是指望字符匹配,删除和比较长。

+0

这并不是很多,但没有人认为这个答案吐在表演脸上吗?采取一项简单的任务,并使其消耗内存和时间... dis-like。 – 2015-02-08 05:46:54

0

你可以这样做 -

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

+0

你能告诉我为什么str.matches(“[。!?])中的同样的正则表达式没有给出预期的结果吗? – 2015-02-08 05:31:46

+0

因为你的字符串与正则表达式'[。!?]'不匹配。”更新了答案。 – 2015-02-08 05:40:27

+0

Shouldn这些单词中的一些单独采用返回true? – 2015-02-08 05:44:35