2014-02-17 44 views
1

我正在學習正則表達式。假設,如果我有兩個字符串,如abcd & bcdd。爲了使它們等於字符串,我必須從第一個字符串中刪除a,並從最後一個字符串中刪除d。這是可能的計數匹配的數字,如bcd =>(3)。Java正則表達式找出匹配詞的個數

目前,我這樣做

Pattern p= Pattern.compile("["+abcd+"]{2}"); 
Matcher m= p.matcher("abcd bcdd"); 

我現在的解決方案並沒有爲我提供正確的結果。所以,我的問題

1)這可能嗎?

2)如果可能,那我該怎麼做到呢?

希望你能幫助我增加正則表達知識。

回答

1

不知道爲什麼你會使用正則表達式,如果你所需要的只是「bcd」的數量。我已經把這兩個非正則表達式和正則表達式版本進行比較。

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
/** 
    <P>{@code java BcdRegexXmpl}</P> 
**/ 
public class BcdRegexXmpl { 
    public static final void main(String[] igno_red) { 
     String sSentence = "abcd bcdd"; 
     int iBcds = 0; 
     int iIdx = 0; 
     while(true) { 
     int iBcdIdx = sSentence.indexOf("bcd", iIdx); 
     if(iBcdIdx == -1) { 
      break; 
     } 
     iIdx = iBcdIdx + "bcd".length(); 
     iBcds++; 
     } 

     System.out.println("Number of 'bcd's (no regex): " + iBcds); 

     //Alternatively 

     iBcds = 0; 
     //Same regex as @la-comadreja, with word-boundaries 
     //(for multiple "bcd"-s in a single word, remove the "\\b"-s) 
     Matcher m = Pattern.compile("\\b\\w*bcd\\w*\\b").matcher(sSentence); 
     while(m.find()) { 
     System.out.println("Found at index " + m.start()); 
     iBcds++; 
     } 
     System.out.println("Number of 'bcd's (with regex): " + iBcds); 
    } 
} 

輸出:

[R:\jeffy\programming\sandbox\xbnjava]java BcdRegexXmpl 
Number of 'bcd's (no regex): 2 
Found at index 0 
Found at index 5 
Number of 'bcd's (with regex): 2 
+0

我喜歡你的indexOf()的答案。不過,您不需要將非正則表達式字符串分割成單詞。 –

+0

當然。謝謝你的提示。更新。 – aliteralmind

0

你的模式應該是:

(a?)(bcd)(d?) 

另一種可能性是它寫成

\w*bcd\w* 

如果要算的數字符串中的「bcd」:

int bcds = 0; 
for (int i = 0; i < str.length() - 2; i++) { 
    if (str.charAt(i) == 'b' && str.charAt(i+1) == 'c' && str.charAt(i+2) == 'd') 
     bcds++; 
} 
0

一個最大概括性,簡明易讀(和合理有效)非正則表達式的答案:

int countMatches(String s, String searchStr) { 
    //Here, s is "abcd bcdd" and searchStr is "bcd" 

    int matches = 0; 
    for (int i = 0; i < s.length() - searchStr.length() + 1; i++) { 
     for (int j = 0; j < searchStr.length(); j++) { 
      if (s.charAt(i + j) != searchStr.charAt(j)) break; 
      if (j == searchStr.length() - 1) matches++; 
     } 
    } 
    return matches; 
}