我找不到匹配重複字母的正則表達式。我的問題是我想用正則表達式來過濾垃圾郵件,例如,我想用正則表達式來檢測這些字符串中的「垃圾郵件」和「viagra」: 「xxxSpAmyyy」, 「xxxSPAMyyy」, 「xxxvI a Gr AA yyy「, 」xxxV iiA gR a xxx「重複字母的Java正則表達式
您有任何建議,我怎麼做到這一點很好?
我找不到匹配重複字母的正則表達式。我的問題是我想用正則表達式來過濾垃圾郵件,例如,我想用正則表達式來檢測這些字符串中的「垃圾郵件」和「viagra」: 「xxxSpAmyyy」, 「xxxSPAMyyy」, 「xxxvI a Gr AA yyy「, 」xxxV iiA gR a xxx「重複字母的Java正則表達式
您有任何建議,我怎麼做到這一點很好?
這忽略的情況下,這需要他們是否是一個接一個地排列,或者有其他字符在他們
之間
"(?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
我試過這個,當字符串中有一個或多個字母有重複時,它不起作用,因爲最後一個字符串有(「ii」)。但迄今爲止這是最好的建議。 –
這實際上適用於我。即使是最後一個例子。 – andreih
是的,對不起。我的錯誤之處在於我嘗試了max_distance = 5,它太小了,當max_distnce> 5的時候它工作!例如,我認爲它是「v」和「i」之間的距離,而不是單詞的長度。 –
喜歡搜查?
"v.{0,3}i.{0,3}a.{0,3}g.{0,3}r.{0,3}a"
代碼:
這留下空間字符之間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());
}
我試過這個,當字符串中有一個或多個字母重複時,它不起作用,因爲最後一個字符串有(「ii」)。 –
makePattern方法很棒!我已經嘗試過了,它工作正常,即使是更高級的字符串,如「afdkV我AA ggggxRrR aAqwofv」。但我不明白「0-3事件」不應該是1-3? –
「偉哥」如此匹配,其他字符在0之間。 –
我認爲,你在錯誤的方式。垃圾郵件的過濾與機器學習密切相關。我建議你閱讀大約Bayesian spam filtering。
如果你想,你會得到與拼寫錯誤的單詞(和其他垃圾的種類)的垃圾郵件 - 我建議使用不是基於整個單詞的過濾,但n-grams。
這只是一個例子,我需要正則表達式來匹配這些類型的文本,而不是垃圾郵件過濾器所必需的,但是感謝輸入。 –
你試過任何正則表達式嗎?
喜歡的東西\w*[sSpPaAmM]+\w*
應該做的伎倆
您可以測試在這個網站你的RE:http://www.regexplanet.com/advanced/java/index.html
現在我已經嘗試過了,當字符串中有一個或多個字母重複時,它不起作用,因爲最後一個字符串有(「ii」),與Eggen先生建議的其他語法有相同的問題。 –
你可以嘗試使用positive look-aheads
(?=.*v)(?=.*i)(?=.*a)(?=.*g)(?=.*r)(?=.*a).*
編輯:
(?=.*v.*i.*a.*g.*r.*a.*).*
我試過這個,它不匹配所有的字符串。 –
你有一個不匹配的字符串的例子嗎? – garyh
難道你到目前爲止嘗試什麼? – Borgleader