【问题标题】:Use regex to convert Interpolated string to string.Format使用正则表达式将插值字符串转换为 string.Format
【发布时间】:2016-09-02 07:13:42
【问题描述】:

我和我的同事拥有不同版本的 VisualStudio。他使用了插值字符串,我无法构建解决方案,不得不将它们全部转换为 string.Format。

现在我认为这可能是正则表达式的好练习。

那么如何转换:

$"alpha: {alphaID}, betaValue: {beta.Value}"

到这里:

string.Format("alpha: {0}, betaValue: {1}", alphaID, beta.Value)

现在变量的数量可以变化(比如说 1 - 20,但应该是通用的)

我想出了这个正则表达式来匹配第一个变量

\$.*?{(\w+)}

但我不知道如何重复美元符号后的部分,所以我可以重复结果。

【问题讨论】:

  • 你知道你还需要考虑{{}} 字面括号吗?这不是正则表达式解析代码的最佳工作。相关:stackoverflow.com/questions/31648824/…
  • 还告诉他配置他的 VS 版本,使代码不使用 C#6 功能。这是可能的。
  • string.Format($"alpha: {alphaID}, {0}, betaValue: {1} {beta.Value}", varOne, varTwo) 之类的应该如何处理?

标签: c# regex


【解决方案1】:

Regex.Replace 有一个重载,它接受一个函数,称为MatchEvaluator。你可以这样使用它;

 var paramNumber = 0;     
 var idNames = new List<string>();
 myCSharpString = Regex.Replace(myCSharpString, match => {
    // remember the id inside brackets;
    idNames.Add(match.ToString());

    // return "0", then "1", etc.
    return (paramNumber++).ToString();
 });

在此过程结束时,您的"this is {foo} not {bar}" 之类的字符串将被替换为"this is {0} not {1}",并且您将拥有一个包含{ "foo" , "bar" } 的列表,您可以使用它来组装参数列表。

【讨论】:

    【解决方案2】:

    您可以在旧版 Visual Studio 中使用 C#6 功能using the C# 6 nuget package

    基本上,只需使用

    Install-Package Microsoft.Net.Compilers
    

    关于所有项目。

    【讨论】:

      【解决方案3】:

      我没有c# 的经验,但这可能会对您有所帮助:

      \{(.+)}\gU

      说明

      { matches the character { literally

      . matches any character (except newline)

      Quantifier: + Between one and unlimited times, as few times as possible, expanding as needed [lazy]

      } matches the character } literally

      g modifier: global. All matches (don't return on first match)

      U modifier: Ungreedy

      【讨论】:

      • 我认为这种格式错误的 PCRE 正则表达式在 C# 中没有多大帮助。
      • 没关系,我可以在notepad++或者其他正则表达式替代工具中输入代码并运行。我将摆脱 \gU 并在加号后插入惰性运算符 (?)。
      【解决方案4】:

      以下是一些不涉及正则表达式的选项:

      1. 您可以使用 ReSharper。它内置了此类转换。
      2. 如果您不想为 ReSharper 付费,请使用 Roslyn 编写您的自定义代码修复程序。 Here is an examplestring.format 到插值字符串,你只需要将它反转。

      3. 手动操作

      4. 如果可以,请让您的同事为您做这件事。
      5. 更新VS

      【讨论】:

        猜你喜欢
        • 2021-09-16
        • 2012-01-28
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 2013-06-09
        • 2015-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多