2016-04-28 27 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相等。