2016-04-28 29 views
-1

c#有Interpolated strings。這意味着,這個字符串:如何在Interpolated字符串上製作正則表達式

"{Variable} Text \{NotVariable\}" 

對應於:

Variable + "Text {NotVariable}" 

我需要檢查,該字符串是允許的,在進入的輸入列表,如SPIL。變量和「文本{NotVaraible}」。

一個傢伙發佈了類似的問題,但我無法修改答案以滿足我的需要。 Link to similar problem

有沒有人有propper解決方案?

+0

你的意思是你必須處理一些文字'「{變量} \」文字\ {NotVariable \} \「」'? –

+0

我需要將字符串「{變量}文本\ {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} 

是從加入matchescheck_string(實際插字符串)的輸出建立的result_string相等。