2015-02-08 47 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