Преобразование совпадений регулярных выражений в список строк - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь найти равную подстроку в большом списке около 50 000 строк, вот так хорошо:

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

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

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

foreach (string phrase in matchWordsList)
{
     foreach (string str in bigList)
     {
          string[] stringsToTest = new[] { phrase };
          var escapedStrings = stringsToTest.Select(s => Regex.Escape(s)); 
          var regex = new Regex("\\b(" + string.Join("|", escapedStrings) + ")\\b");
          var matches = regex.Matches(str);

          foreach (string result in matches) /// Incorrect: System.InvalidCastException 
          {
              resultsList.Add(result);
          }
     }
}

Получение строк из matches непосредственно в исключение list:

Произошло необработанное исключение типа 'System.InvalidCastException' в test.exe

Дополнительная информация: Невозможно привести объект типа 'System.Text.RegularExpressions.Match' к типу 'System.String'.

Итак, я пытаюсь выяснить, горячо ли преобразовать var matches = regex.Matches(str); к списку

Ответы [ 3 ]

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

Просто используйте Match введите foreach цикл:

foreach (Match result in matches)
{
    resultsList.Add(result.Value);
}
0 голосов
/ 30 января 2019

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

Будет ли это работать?Он объединяет ваш "matchWordsList" в одно выражение, а затем добавляет каждое совпадение из bigList в resultsList:

var escapedStrings = matchWordsList.Select(s => Regex.Escape(s)); 
var regex = new Regex("\\b(" + string.Join("|", escapedStrings) + ")\\b");
foreach (string str in bigList)
{
    if (regex.IsMatch(str))
    {
        resultsList.Add(str);
    }
}

Так что, если matchWordsList содержит ["test","words","cheese"], а str равно "This is a test to check if Regex is matching words. I like cheese.", он добавит str к resultsList один раз (даже при наличии 3 совпадений).

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

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

Вы можете сделать это с помощью linq.Однако сначала вам потребуется Cast, затем Select

var resultsList = regex.Matches(str)
                       .Cast<Match>()
                       .Select(m => m.Value)
                       .ToList();

или

someList.AddRange(
   regex.Matches(str)
         .Cast<Match>()
         .Select(m => m.Value));
...