#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}
на, чтобы соответствовать только буквам).
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