C# регулярное выражение для соответствия строки с двойными столбцами, которые не заключены в кавычки - PullRequest
1 голос
/ 03 марта 2020

Я схожу с ума от этого! Я хотел бы извлечь каждую часть строки, которая заключена в двойные фигурные скобки, но не заключена в одну кавычку.

Так что когда "{{Test}} '{{hello}}' {{what}} {that}}"

Результат будет:

{{Test}}
{{what}}

Обновление:

При этом я получаю все детали, которые заключены в двойные фигурные скобки:

Regex.Matches(input, @"(\{\{.+?\}\})")

Обновление 2:

Не очень красиво, но я думаю, что это работает:

var removedQuotationParts = Regex.Replace(input, @"(['].+?['])", "");

var parts = Regex.Matches(removedQuotationParts, @"(\{\{.+?\}\})")
                .Cast<Match>()
                .Select(m => m.Value)
                .ToList();

1 Ответ

1 голос
/ 03 марта 2020

Вы можете использовать Best Trick Ever , а именно, сопоставить любой текст внутри апострофов, а затем сопоставить и захватить ожидаемый вами шаблон.

Возможное регулярное выражение будет выглядит как

'[^']*'|({{.*?}})

Это соответствует

  • '[^']*' - ', затем любые 0+ символов, кроме ', а затем '
  • | - или
  • ({{.*?}}) - Группа захвата 1: {{, любые 0+ символов, как можно меньше (включая новые строки из-за опции RegexOptions.Singleline, см. Код ниже), затем }}.

См. C# демо :

var input = "{{Test}} '{{hello}}' {{what}} {that}}";
var result = Regex.Matches(input, @"'[^']*'|({{.*?}})", RegexOptions.Singleline)
    .Cast<Match>()
    .Select(m => m.Groups[1].Value)
    .Where(x => !String.IsNullOrEmpty(x))
    .ToList(); 
foreach (var s in result)
    Console.WriteLine(s);

Выход:

{{Test}}
{{what}}

ПРИМЕЧАНИЕ: .Where(x => !String.IsNullOrEmpty(x)) необходимо пропустить все совпадения, в которых группа 1 не совпадает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...