Найти равную подстроку в списке строк - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь выяснить, как найти равную подстроку в большом списке строк.

Этот метод отлично работает:

var results = myList.FindAll(delegate (string s) { return s.Contains(myString); });

Но он также ищет суб-строка с частью слова, например, если я ищу «ты делаешь», он также находит дополнительное «ты не делаешь», потому что содержит «ты делаешь».

В случае строки этот метод кажетсядает желаемый результат:

 bool b = str.Contains(myString);
 if (b)
 {
     int index = str.IndexOf(myString);    
 }

Как получить такой же вид соответствия со списком

1 Ответ

0 голосов
/ 29 января 2019

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

string[] stringsToTest = new [] { "you do", "what" };
var escapedStrings = stringsToTest.Select(s => Regex.Escape(s)); // escape the test strings so that we can safely build them into the expression
var regex = new Regex("\\b(" + string.Join("|", escapedStrings) + ")\\b");
var matches = regex.Matches("How you do? How you don't? What you do? How you do what you do?");

Если у вас есть только один термин, вы можете переписать это как:

var regex = new Regex(string.Format("\\b({0})\\b", Regex.Escape("you do")));
var matches = regex.Matches("How you do? How you don't? What you do? How you do what you do?");

И затем вы можете сопоставить с помощью match.Groups[0] (для каждой группы в коллекции совпадений), чтобы получить сопоставленное значение:

foreach (Match m in matches)
{
    Console.WriteLine(string.Format("Matched {0} at {1}", m.Groups[0].Value, m.Groups[0].Index));
}

Попробуйте онлайн

...