2016-04-28 1 views
-1

C# имеет Interpolated strings. Это означает, что эта строка:Как сделать регулярное выражение на интерполированных струнах

"{Variable} Text \{NotVariable\}" 

соответствует:

Variable + "Text {NotVariable}" 

мне нужно проверить, что строка допускается и SPIL в в списке входов, например. Переменная и «Текст {Невариант}".

Парень опубликовал аналогичный вопрос, но я не могу изменить ответ в соответствии с моими потребностями. Link to similar problem

Есть ли у кого-нибудь вспомогательное решение?

+0

Вы имеете в виду, что вам нужно обработать некоторый литерал '' {Variable} \ "Text \ {NotVariable \} \" "'? –

+0

Мне нужно преобразовать строку «{Variable} Text \ {NotVariable \}" в две разные строки. – user3265569

+0

Ну, есть что-то непонятное: экранирование '{' и '}' в интерполированных строках означает их удвоение. Итак, пример должен читать '$" {Variable} \ "Text \" {{NotVariable}} "', и вам нужно превратить это в 'Variable +" \ "Text \" {{NotVariable}} "'? –

ответ

1

Вы можете попробовать following regex:

(?s)(?<bndr>\$"|(?!^)\G)  # Get the start of the interpolated string literal or the end of previous match 
(?: 
(?<var>{[^}]*})    # Match a variable {non-braces-inside} 
|       # OR... 
(?<literal>(?:\\.|{{|}}|[^"\\{}])*) # Escaped entities or everything else 
) 

Смотреть это C# демо результаты:

var Variable = ""; 
var input_text = "$\"text1 {Variable} \\\"Text\\\" {{NotVariable}}\""; 
var pat = @"(?s)(?<bndr>\$""|(?!^)\G)(?:(?<var>{[^}]*})|(?<literal>(?:\\.|{{|}}|[^""\\{}])*))"; 
var matches = Regex.Matches(input_text, pat) 
    .Cast<Match>() 
    .Select(p => p.Groups["var"].Success ? p.Groups["var"].Value.Trim(' ', '{', '}') : "\"" + p.Groups["literal"].Value.Replace("{{", "{").Replace("}}", "}") + "\"") 
    .ToList(); 
matches.RemoveAll(p => p == "\"\""); 
Console.WriteLine(string.Join(" + ", matches));        //"text1 " + Variable + " \"Text\" {NotVariable}" 
var result_string = "text1 " + Variable + " \"Text\" {NotVariable}" + ""; //text1 "Text" {NotVariable} 
var check_string = $"text1 {Variable} \"Text\" {{NotVariable}}";   //text1 "Text" {NotVariable} 

The result_string, который построен с выхода присоединился matches и check_string (фактической интерполированное строки) равны ,

Смежные вопросы