繰り返される文字に一致する正規表現が見つかりません。私の問題は、正規表現を使用してスパムメールを除外したいということです。たとえば、「xxxSpAmyyy」、「xxxSPAMyyy」、「xxxvI a Gr AA」の文字列で、「spam」と「viagra」を検出するために正規表現を使用したいと思います。 yyy "、" xxxV iiA gR a xxx "
私がそれを良い方法で行う方法について何か提案はありますか?
正規表現を試しましたか?
何かのようなもの\w*[sSpPaAmM]+\w*
がトリックを行う必要があります
このサイトでREをテストできます:http://www.regexplanet.com/advanced/java/index.html
これを検索したいですか?
"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());
}
これは大文字と小文字を区別せず、それらが隣り合っているか、またはそれらの間に他の文字があるかどうかを判断します
"(?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
私はあなたが間違った道を進んでいると思います。スパムのフィルタリングは、機械学習と密接に関連しています。ベイジアンスパムフィルタリングについて読むことをお勧めします。
スペルミスのある単語(およびその他の種類のゴミ)を含むスパムメールが届くと思われる場合は、単語全体ではなく、n-gramに基づいたフィルタリングを使用することをお勧めします。
あなたは前向きな先読みを使ってみることができます
(?=.*v)(?=.*i)(?=.*a)(?=.*g)(?=.*r)(?=.*a).*
編集:
(?=.*v.*i.*a.*g.*r.*a.*).*