2014-12-13 41 views
1

我想解決以下問題。Java字符串匹配正則表達式

給定一個字符串和一個正則表達式模式,給出模式在字符串中出現的次數。正則表達式的符號含義如下:

. - 2 occurrences of the previous character, 
+ - 4 occurrences of previous character, 
* – more than 5 occurrences of the previous character 

樣品輸入給出:

aaaaaannndnnnnnnfffhfhhgjjjwkkkllclc 
a. 
n+ 
a* 
an. 
a.d. 

樣本輸出給定:

5 
3 
1 
1 
0 

我的做法是對所有的正則表達式轉換到正常模式。即對於上述示例,我的RegEx將是:

aa 
nnnn 
aaaaaa 
ann 
aadd 

然後計算出現次數。但我毫無頭緒做什麼,如果輸入的正則表達式是:

a*d. 

請注意,我不能使用任何內置的功能,如Pattern.Matches。有什麼建議麼?

謝謝。

+0

'*'是未綁定的(大於5的任何數字),所以你不能真正使模式明確,因爲' a *'是一組有限的字符串。此外,任意重新定義「+」和「*」的人應該意識到她可能會導致很多混淆。 – 2014-12-13 10:56:58

+0

你想創建新規則嗎? – 2014-12-13 11:24:53

+0

如果您不能使用內建函數,將模式轉換爲「真實」的正則表達式模式有什麼好處?你可以使用正則表達式來完成這個任務嗎? – 2014-12-13 11:54:17

回答

1

下面是解析模式並告訴您輸入字符串是否以指定模式開始的方法示例。我沒有完成它,因爲我認爲這是某種形式的家庭工作:

boolean startsWithPattern(String pattern, String str) { 
    int strPos = 0; 
    int patternPos = 0; 
    // parse pattern and check input str 
    while (patternPos < pattern.length()) { 
     char symbol = pattern.charAt(patternPos); 
     // TODO this will not work for patterns like `a`, only for `a.`, `b*`, `n+` 
     char action = pattern.charAt(patternPos + 1); 
     patternPos += 2; 
     switch (action) { 
      case '.': 
       int end = strPos + 2; // check only two symbols 
       for (; strPos < end; ++strPos) { 
        if (str.charAt(strPos) != symbol) { 
         return false; // string don't match 
        } 
       }      
       break; 
      case '*': 
       // TODO some cycle that would check 5+ positions in str 
       break; 
      case '+': 
       // TODO similar to '.' 
       break; 
     } 
    } 
    return true; // string starts with pattern! 
} 
+0

這不是一個家庭作業問題。你可以在http://ideone.com/06CQSO 找到我的實現我相信你沒有解決我的問題。我被困在如何解決輸入問題:a * d。 – user2761431 2014-12-13 12:57:34

+0

你可以用你目前的方法解決模式'a * d.'的問題,但是解決方案會非常不起作用。爲模式「a * d」生成所有'正常模式'似乎非常痛苦,並且在長度爲100000的字符串中搜索它們(例如)。 – 2014-12-13 13:11:34

+1

以下是我對您問題的完整解決方案:https://ideone.com/kK2nQ6 – 2014-12-13 22:23:12

相關問題