Если вы хотите сопоставить некоторые подстроки в любом порядке, вы либо используете чередование, где перечислены все возможные варианты, либо используют привязанные образы.
В этом случае я бы предложил использовать позитивные образы, которые обеспечат как свободный порядок букв в слове, так и их обязательное присутствие в соответствующем слове.
Использование
(?i)\b(?=\w*m)(?=\w*a)(?=\w*h)(?=\w*d)\w+
См regex demo (ПРИМЕЧАНИЕ: Вы можете заменить \w
с \p{L}
только соответствуют букв).
Деталь:
(?i)
- регистронезависим режим на
\b
- ведущее слово граничного
(?=\w*m)
- после 0+ слов символов (то есть буквы, цифра или подчеркивание), необходимо be m
(?=\w*a)
- после 0+ слов символов, должно быть a
(?=\w*h)
- после того, как 0+ слово символов, должно быть h
(?=\w*d)
- после того, как 0+ слово символов, должно быть d
\w+
- 1 или более букв, цифр или символов подчеркивания (вы можете заменить \p{L}
только матч письма).
C# demo:
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
Должен '«Ах! Mr D»' будет принят (строка содержит все необходимые символы) или отклонен (строка содержит три отдельных слов, каждое из которых не содержит * все * ожидаемые характеристики)? –
Нет, все слово не предложение –
Если вам нужно извлечь эти слова из более длинных текстов, используйте ['\ b (? = \ W * m) (? = \ W * a) (? = \ W * h) (? = \ W * D) \ ш + '] (http://regexstorm.net/tester?p=%5cb (% 3f% 3d% 5cw * м) (% 3F% 3d% 5cw * а) (% 3f % 3d% 5cw * ч) (% 3f% 3d% 5cw * г)% 5cw% 2b & я = Mohamed% 2c + Hamada + и + Махмуд + соответствует% 2c +, но + молоток & о = я). Если вы проверите их как отдельные строки, используйте '^ (? = \ W * m) (? = \ W * a) (? = \ W * h) (? = \ W * d) \ w + $' –