Я пытаюсь выяснить, как обнаружить дополнительные символы в слове спама как:
pha.rmacy
или vi*agra
какие-либо идеи?
Вы можете использовать показатель (не) сходства, например расстояние редактирования . Например, расстояние редактирования между vi.agra и viagra равно 1.
Затем вы определяете, что данное слово совпадает со спам-словом, если расстояние редактирования между ними ниже определенного порога, например, 2.
Но если вы действительно хотите использовать регулярное выражение, вы можете использовать что-то вроде / [^ a-zA-Z0-9- \ s] /
, чтобы убрать пунктуацию в слове. Но опять же, вы не сможете идентифицировать что-то вроде viZagra
как то же слово, что и viagra
.
Это зависит от того, насколько широко вы хотите соответствовать. Следующее будет соответствовать любой непрерывной последовательности символов без пробелов или слов, вкрапленных между этими буквами:
/p[^\s\w]*h[^\s\w]*a[^\s\w]*r[^\s\w]*m[^\s\w]*a[^\s\w]*c[^\s\w]*y/
Вы можете построить это регулярное выражение в коде. Например, в Perl:
$re = join("[^\\s\\w]*", split("", "pharmacy"))
В конечном итоге регулярные выражения, вероятно, не удовлетворят всем вашим требованиям.
Регулярные выражения не кажутся подходящим инструментом для выяснения этого. Но в качестве попытки ответить на этот вопрос, просто потому что это интересно, простым способом было бы сделать что-то вроде этого:
/v.?i.?a.?g.?r.?a/
Это будет соответствовать 0 или 1 символу между каждой буквой.