Регулярное выражение для сопоставления с любым словом, содержащим определенные буквы или более?

#regex

Вопрос:

Мне нужно регулярное выражение для сопоставления с любым словом, содержащим буквы: m a h d вместе в любом порядке, так что Мохамед, Хамада и Махмуд совпадают, но хаммер не совпадает Я попытался сделать следующее (я новичок в регулярном выражении!):

 Regex reg=new Regex("[mahd]");
 

Но, очевидно, это неправильный шаблон

Комментарии:

1. Должно "Ah! Mr D" быть принято (строка содержит все обязательные символы) или отклонено (строка содержит три отдельных слова, каждое из которых не содержит всех ожидаемых символов)?

2. Нет, целое слово, а не предложение

Ответ №1:

Если вы хотите сопоставить некоторые подстроки в любом порядке, вы либо используете чередование, где перечислены все возможные варианты, либо используете привязанные предварительные просмотры.

В этом случае я бы предложил использовать положительные прогнозы, которые обеспечат как свободный порядок букв в слове, так и их обязательное присутствие в сопоставляемом слове.

Использовать

 (?i)b(?=w*m)(?=w*a)(?=w*h)(?=w*d)w 
 

Смотрите Демонстрацию регулярных выражений (ПРИМЕЧАНИЕ: вы можете заменить w p{L} на, чтобы соответствовать только буквам).

Подробные сведения:

  • (?i) — режим без учета регистра включен
  • b — граница начального слова
  • (?=w*m) — после символов 0 слов (т. Е. Букв, цифр или символов подчеркивания) должно быть m
  • (?=w*a) — после символов 0 слов должно быть a
  • (?=w*h) — после символов 0 слов должно быть h
  • (?=w*d) — после символов 0 слов должно быть d
  • w — 1 или более букв, цифр или символов подчеркивания (вы можете заменить p{L} на, чтобы соответствовать только буквам).

Демонстрация C #:

 var str  = "Mohamed, Hamada and Mahmoud match, but not hammer";
var letters = "mahd";
var pat = string.Format(@"b{0}w b", string.Join("", letters.Select(s => string.Format(@"(?=w*{0})", s))));
var result = Regex.Matches(str, pat, RegexOptions.IgnoreCase)
    .Cast<Match>()
    .Select(match => match.Value)
    .ToList();
Console.WriteLine(String.Join("n", result)); // Demo line