Я пытаюсь понять, как найти равную подстроку в большом списке строк.
Этот метод отлично работает:
var results = myList.FindAll(delegate (string s) { return s.Contains(myString); });
Но он также ищет подстроку с частью слова, например, если я ищу «ты делаешь», он также находит дополнительное «ты не делаешь», потому что содержит «ты делаешь..».
В случае строки этот метод дает желаемый результат:
bool b = str.Contains(myString);
if (b)
{
int index = str.IndexOf(myString);
}
Как получить такое же соответствие со списком
@John Привет, я не уверен в использовании регулярного выражения с поиском подстроки в большом списке строк, я думаю, это должно быть для каждой строки
Насколько велик список?
@John около 50 000 строк





Вы можете использовать регулярные выражения, чтобы вернуть все совпадения для набора потенциальных терминов:
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));
}
Итак, если мой список List<string> myList = new List<string>(); содержит около 50 000 строк типа "Как дела? Как дела? Что делаешь? Как делаешь, что делаешь?", то в этом случае каждая строка должна обрабатываться var matches = regex.Matches(myString) в цикле правильно?
Вы уверены, что это не сложная обработка для этого случая?
Вы получите лучшую производительность, используя IndexOf (не Contains, который вы используете в настоящее время), а затем проверяя следующий символ после совпадающей строки. Это зависит от того, насколько эффективным он вам действительно нужен. Попробуй это. Если это слишком медленно, оптимизируйте.
вы имеете в виду IndexOf с delegate?
Я имел в виду код, который вы предоставили под «В случае строки этот метод дает желаемый результат:»
Ну, этот метод дает результат для строки, мой список процессов цели, так же, как и с регулярным выражением, должен быть зациклен для каждого, работает намного медленнее
Для приведенной выше тестовой строки метод регулярных выражений в худшем случае вдвое медленнее метода без регулярных выражений с использованием IndexOf, который дает аналогичные результаты. Это то, что вам нужно оптимизировать (например, вы проверили скорость этого, чтобы определить, не слишком ли это медленно)? Я уверен, что кто-то другой с радостью даст вам ответ, в котором используется IndexOf.
Извините за поздний ответ, до сих пор я не мог проверить ваше решение. Я не уверен, как получить список строк из совпадений с регулярными выражениями, и не нашел примера в Интернете, чтобы проверить ваше решение. Не могли бы вы дать мне ссылку или пример, как это должно быть сделано
@Ai_ve, что ты имеешь в виду под списком строк? Какие струны?
Я добавил новый вопрос здесь с примером моего кода, потому что это похоже на проблему другого типа.
Самый простой способ — использовать регулярные выражения (например,
\byou do\b).