2012-12-03 26 views
0

我找不到匹配重複字母的正則表達式。我的問題是我想用正則表達式來過濾垃圾郵件,例如,我想用正則表達式來檢測這些字符串中的「垃圾郵件」和「viagra」: 「xxxSpAmyyy」, 「xxxSPAMyyy」, 「xxxvI a Gr AA yyy「, 」xxxV iiA gR a xxx「重複字母的Java正則表達式

您有任何建議,我怎麼做到這一點很好?

+4

難道你到目前爲止嘗試什麼? – Borgleader

回答

0

這忽略的情況下,這需要他們是否是一個接一個地排列,或者有其他字符在他們

之間

"(?i).{0,}v.{0,}i.{0,}a.{0,}g.{0,}r.{0,}a.{0,}" 
如果你知道有多少個字符可以是字母之間,你可以進入 .{0,max_distance}代替 .{0,}

UPDATE:

它的工作即使是重複的,因爲我已經嘗試過:

String str = "xxxV iiA gR a xxx"; 

    if(str.matches("(?i).{0,}v.{0,}i.{0,}a.{0,}g.{0,}r.{0,}a.{0,}")){ 
     System.out.println("Yes"); 
    } 
    else{ 
     System.out.println("No"); 
    } 

這將打印Yes

+0

我試過這個,當字符串中有一個或多個字母有重複時,它不起作用,因爲最後一個字符串有(「ii」)。但迄今爲止這是最好的建議。 –

+0

這實際上適用於我。即使是最後一個例子。 – andreih

+0

是的,對不起。我的錯誤之處在於我嘗試了max_distance = 5,它太小了,當max_distnce> 5的時候它工作!例如,我認爲它是「v」和「i」之間的距離,而不是單詞的長度。 –

0

喜歡搜查?

"v.{0,3}i.{0,3}a.{0,3}g.{0,3}r.{0,3}a" 

Pattern


代碼:

這留下空間字符之間0至3個字符。我沒有編譯以下內容, 但它「應該工作」。

String[] strings = new String[] { ""xxxV iiA gR a xxx"" }; 
final Pattern spamPattern = makePattern("viagra"); 
for (String s : strings) { 
    boolean isSpam = spamPattern.matcher(s).find(); 
    if (isSpam) { 
     System.out.println("Spam: " + s); 
    } 
} 
... 
Pattern makePattern(String cusWord) { 
    cusWord = cusWord.toLowerCase(); 
    StringBuilder sb = new StringBuilder(); 
    sb.append("(?i)"); // Case-insensitive setting. 
    for (int i = 0; i < cusWord.length();) { 
     int cp = cusWord.codePointAt(i); 
     i += Character.charCount(cp); 
     if ('o' == cp) { 
      sb.append("[o0]"); 
     } else if ('l' == cp) { 
      sb.append("[l1]"); 
     } else { 
      sb.appendCodePoint(cp); 
     } 
     sb.append(".{0,3}"); // 0 - 3 occurrences of any char. 
    } 
    return Pattern.compile(sb.toString()); 
} 
+0

我試過這個,當字符串中有一個或多個字母重複時,它不起作用,因爲最後一個字符串有(「ii」)。 –

+0

makePattern方法很棒!我已經嘗試過了,它工作正常,即使是更高級的字符串,如「afdkV我AA ggggxRrR aAqwofv」。但我不明白「0-3事件」不應該是1-3? –

+0

「偉哥」如此匹配,其他字符在0之間。 –

0

我認爲,你在錯誤的方式。垃圾郵件的過濾與機器學習密切相關。我建議你閱讀大約Bayesian spam filtering

如果你想,你會得到與拼寫錯誤的單詞(和其他垃圾的種類)的垃圾郵件 - 我建議使用不是基於整個單詞的過濾,但n-grams

+0

這只是一個例子,我需要正則表達式來匹配這些類型的文本,而不是垃圾郵件過濾器所必需的,但是感謝輸入。 –

0

你試過任何正則表達式嗎?

喜歡的東西\w*[sSpPaAmM]+\w*應該做的伎倆

您可以測試在這個網站你的RE:http://www.regexplanet.com/advanced/java/index.html

+0

現在我已經嘗試過了,當字符串中有一個或多個字母重複時,它不起作用,因爲最後一個字符串有(「ii」),與Eggen先生建議的其他語法有相同的問題。 –

0

你可以嘗試使用positive look-aheads

(?=.*v)(?=.*i)(?=.*a)(?=.*g)(?=.*r)(?=.*a).* 

編輯:

(?=.*v.*i.*a.*g.*r.*a.*).* 
+0

我試過這個,它不匹配所有的字符串。 –

+0

你有一個不匹配的字符串的例子嗎? – garyh