Найти точное совпадение в строке - C# - PullRequest
0 голосов
/ 03 августа 2020

Как найти точное совпадение в строке? Например, если бы у меня была строка с таким текстом:

string ClientName = "Sunny Mrs Cool";
string[] stringArray = { "Mr", "Ms", "Dr", "Mrs" };
    
foreach (string x in stringArray)
{                               
   if (ClientName.Contains(x))
   {}
}

И я хочу найти «миссис», я хочу получить только точное совпадение, а не другое. Я пробовал методы Contains и IndexOf, но они также дают мне "Mr". В некоторых строках есть Ms, Dr или Mr.

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Без добавления головных болей / регулярных выражений вы можете довольно легко использовать Linq:

string ClientName = "Sunny Mrs Cool";
    
string[] stringArray = { "Mr", "Ms", "Dr", "Mrs" };
    
var results = ClientName.Split(' ').ToList().Where(x => stringArray.Contains(x));
    
Console.WriteLine(results.Single());  // result is "Mrs"

Вместо этого вы можете выполнить logi c на основе результатов:

if (results.Any())
{
    process(results.first());
}
else
{
   //no valid result!
}

Или если перечисление массива и поиск совпадения имеет значение. Приведенный выше код с al oop тоже может работать:

var result = results.First();
foreach(var x in stringArray)
{
   if (x == result)
   {
       Console.WriteLine($"{ClientName} contains: {result}");
       // Writes "Sunny Mrs Cool contains: Mrs"
   }
}
0 голосов
/ 03 августа 2020

Для этого вы можете использовать Regex. Ваш шаблон Regex может быть таким:

\b(Mr|Ms|Dr|Mrs)\b
  • \b означает Граница слова
  • | означает OR .

Итак, это регулярное выражение будет соответствовать Mr, Ms, Dr или Mrs на границах слова.

Изменить:

Проблема с вашим кодом в том, что Mr является подмножеством Mrs. Итак, любая строка содержит Mrs, она также будет содержать Mr. Поскольку вы сначала ищете Mr, вы всегда найдете его до Mrs.

Поиск по границам слов решает эту проблему простым способом.

Вот код C# для использования Regex для этой задачи:

string clientName = "Sunny Mrs Cool";
string[] stringArray = { "Mr", "Ms", "Dr", "Mrs" };
string pattern = $"\\b({string.Join("|", stringArray)})\\b"; // or simply just "\b(Mr|Ms|Dr|Mrs)\b"
Console.WriteLine(Regex.Match(clientName, pattern).Groups[1].Value); // prints "Mrs"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...