【问题标题】:How to make a Regex on Interpolated Strings如何在插值字符串上制作正则表达式
【发布时间】:2016-08-23 01:04:21
【问题描述】:

c# 有Interpolated strings。这意味着这个字符串:

"{Variable} Text \{NotVariable\}"

对应于:

Variable + "Text {NotVariable}"

我需要检查该字符串是否允许并溢出到输入列表中,例如。变量和“文本 {NotVaraible}”。

一个人发布了一个类似的问题,但我无法修改答案以满足我的需要。 Link to similar problem

有人有合适的解决方案吗?

【问题讨论】:

  • 你的意思是你必须处理一些文字 "{Variable} \"Text \{NotVariable\}\""?
  • 我需要将字符串“{Variable} Text \{NotVariable\}”转换成两个不同的字符串。
  • 嗯,有一些不清楚的地方:在插值字符串中转义 {} 意味着将它们加倍。所以,这个例子应该是$"{Variable} \"Text\" {{NotVariable}}",你需要把它变成Variable + "\"Text\" {{NotVariable}}"

标签: c# regex


【解决方案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 相等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2016-12-08
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多