Регулярное выражение: игнорировать лишние символы - PullRequest
5 голосов
/ 25 марта 2010

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

pha.rmacy или vi*agra

есть идеи?

Ответы [ 3 ]

3 голосов
/ 25 марта 2010

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

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

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

2 голосов
/ 25 марта 2010

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

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

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

1 голос
/ 25 марта 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...