Regex: проигнорируйте дополнительные символы

Я пытаюсь выяснить, как обнаружить дополнительные символы в слове спама как:

pha.rmacy или vi*agra

какие-либо идеи?

5
задан Benjamin 20 September 2014 в 13:02
поделиться

3 ответа

Вы можете использовать показатель (не) сходства, например расстояние редактирования . Например, расстояние редактирования между vi.agra и viagra равно 1.

Затем вы определяете, что данное слово совпадает со спам-словом, если расстояние редактирования между ними ниже определенного порога, например, 2.

Но если вы действительно хотите использовать регулярное выражение, вы можете использовать что-то вроде / [^ a-zA-Z0-9- \ s] / , чтобы убрать пунктуацию в слове. Но опять же, вы не сможете идентифицировать что-то вроде viZagra как то же слово, что и viagra .

3
ответ дан 14 December 2019 в 13:32
поделиться

Это зависит от того, насколько широко вы хотите соответствовать. Следующее будет соответствовать любой непрерывной последовательности символов без пробелов или слов, вкрапленных между этими буквами:

/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"))

В конечном итоге регулярные выражения, вероятно, не удовлетворят всем вашим требованиям.

1
ответ дан 14 December 2019 в 13:32
поделиться

Регулярные выражения не кажутся подходящим инструментом для выяснения этого. Но в качестве попытки ответить на этот вопрос, просто потому что это интересно, простым способом было бы сделать что-то вроде этого:

/v.?i.?a.?g.?r.?a/

Это будет соответствовать 0 или 1 символу между каждой буквой.

2
ответ дан 14 December 2019 в 13:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: