2016-09-14 2 views
0

мне нужен Regex чтобы соответствовать любое слово, содержащее буквы: M + + H + D вместе в любом порядке так, Mohamed, Hamada и Махмуд матчи, но молоток не делают матч я попытался сделать следующее (я новичок в Regex!):Регулярное выражение для соответствия любому слову, содержащему определенные буквы или больше?

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

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

+0

Должен '«Ах! Mr D»' будет принят (строка содержит все необходимые символы) или отклонен (строка содержит три отдельных слов, каждое из которых не содержит * все * ожидаемые характеристики)? –

+0

Нет, все слово не предложение –

+0

Если вам нужно извлечь эти слова из более длинных текстов, используйте ['\ 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 + $' –

ответ

1

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

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

Использование

(?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 
Смежные вопросы