Как лучше всего получить список строк, соответствующих строке внутри строки, просматривая список строк? - PullRequest
0 голосов
/ 16 июня 2020
• 1000 *

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

string[] allmatches = { "{CC}", "{A}", "{CC}", "{B}" };

Есть ли простой способ сделать это с помощью LINQ или, может быть, Regex?

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Создайте регулярное выражение, сначала Escape используя каждый элемент в matches, используя Select, а затем Join используя |. После этого получите Matches регулярного выражения против text и Select Value s:

var regex = string.Join("|", matches.Select(Regex.Escape));
var result = Regex.Matches(text, regex)
            .Cast<Match>()
            .Select(x => x.Value).ToArray();
0 голосов
/ 16 июня 2020

Предполагая, что {A}..{Z} - единственные необходимые совпадения, мы можем попробовать объединить Regex и Linq, например

  string text = 
    @"Lorem Ipsum is {C} simply dummy text {A} of the {C} printing and typesetting industry {B}.";

  string[] allmatches = Regex
    .Matches(text, @"\{[A-Z]\}")
    .Cast<Match>()
    .Select(m => m.Value)
    //.Where(item => matches.Contains(item)) // uncomment to validate matches
    .ToArray();

Давайте посмотрим:

  Console.Write(string.Join(", ", allmatches));

Результат :

  {C}, {A}, {C}, {B}

Изменить: раскомментировать .Where(...), если вам нужны совпадения, которые находятся в matches[] только

Изменить 2: Если совпадают не обязательно содержать только одну букву, измените шаблон:

  .Matches(text, @"\{[A-Z]+\}")    // one or more capital letters
  .Matches(text, @"\{[a-zA-Z]+\}") // one or more English letters
  .Matches(text, @"\{\p{L}+\}")    // one or more Unicode letters
  .Matches(text, @"\{[^}{]+\}")    // one or more characters except "{" and "}" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...