0

繰り返される文字に一致する正規表現が見つかりません。私の問題は、正規表現を使用してスパムメールを除外したいということです。たとえば、「xxxSpAmyyy」、「xxxSPAMyyy」、「xxxvI a Gr AA」の文字列で、「spam」と「viagra」を検出するために正規表現を使用したいと思います。 yyy "、" xxxV iiA gR a xxx "

私がそれを良い方法で行う方法について何か提案はありますか?

4

5 に答える 5

0

正規表現を試しましたか?

何かのようなもの\w*[sSpPaAmM]+\w*がトリックを行う必要があります

このサイトでREをテストできます:http://www.regexplanet.com/advanced/java/index.html

于 2012-12-03T00:50:54.120 に答える
0

これを検索したいですか?

"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());
}
于 2012-12-03T00:36:54.677 に答える
0

これは大文字と小文字を区別せず、それらが隣り合っているか、またはそれらの間に他の文字があるかどうかを判断します

"(?i).{0,}v.{0,}i.{0,}a.{0,}g.{0,}r.{0,}a.{0,}"

文字の間にいくつの文字が入るかがわかっている場合は、.{0,max_distance}代わりに入力できます.{0,}

アップデート:

私が試したように、それは重複に対しても機能します:

    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

于 2012-12-03T00:40:03.980 に答える
0

私はあなたが間違った道を進んでいると思います。スパムのフィルタリングは、機械学習と密接に関連しています。ベイジアンスパムフィルタリングについて読むことをお勧めします。

スペルミスのある単語(およびその他の種類のゴミ)を含むスパムメールが届くと思われる場合は、単語全体ではなく、n-gramに基づいたフィルタリングを使用することをお勧めします。

于 2012-12-03T00:44:25.053 に答える
0

あなたは前向きな先読みを使ってみることができます

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

編集:

(?=.*v.*i.*a.*g.*r.*a.*).*
于 2012-12-03T10:42:59.187 に答える