C# 使用正则表达式将插值字符串转换为string.Format

C# 使用正则表达式将插值字符串转换为string.Format,c#,regex,C#,Regex,我和我的同事有不同版本的VisualStudio。他使用插值字符串,我无法构建解决方案,必须将它们全部转换为string.Format 现在我想这对regex来说可能是一个很好的锻炼 那么,如何将其转换为: $"alpha: {alphaID}, betaValue: {beta.Value}" 为此: string.Format("alpha: {0}, betaValue: {1}", alphaID, beta.Value) 现在变量的数量可以变化,比如说1-20,但是应该是通用的 我

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

现在我想这对regex来说可能是一个很好的锻炼

那么,如何将其转换为:

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

string.Format("alpha: {0}, betaValue: {1}", alphaID, beta.Value)
现在变量的数量可以变化,比如说1-20,但是应该是通用的

我用这个正则表达式来匹配第一个变量

\$.*?{(\w+)}
但是我不知道如何重复美元符号后的部分,所以我可以重复结果。

我没有c语言的经验,但这可能会帮助您:

\{.+}\gU

解释

{与字符{字面上匹配

.匹配除换行符以外的任何字符

量词:+在一次和无限次之间,尽可能少的次数, 根据需要扩展[懒惰]

}逐字匹配字符}

g修饰语:全局。所有比赛不会在第一场比赛中返回

U修饰符:Ungreedy

我没有c语言的经验,但这可能会帮助您:

\{.+}\gU

解释

{与字符{字面上匹配

.匹配除换行符以外的任何字符

量词:+在一次和无限次之间,尽可能少的次数, 根据需要扩展[懒惰]

}逐字匹配字符}

g修饰语:全局。所有比赛不会在第一场比赛中返回


U modifier:Ungreedy

这里有几个不涉及正则表达式的选项:

您可以使用ReSharper。它内置了这样的转换。 如果您不想为ReSharper付费,请与Roslyn一起编写自定义代码修复程序。从string.format到插值字符串,您只需将其反转即可

手动操作

如果可以的话,请你的同事帮你做这件事。 更新VS
以下是几个不涉及正则表达式的选项:

您可以使用ReSharper。它内置了这样的转换。 如果您不想为ReSharper付费,请与Roslyn一起编写自定义代码修复程序。从string.format到插值字符串,您只需将其反转即可

手动操作

如果可以的话,请你的同事帮你做这件事。 更新VS 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();
 });
在这个过程结束时,像这样的字符串is{foo}not{bar}将被替换为this{0}not{1},并且您将拥有一个包含{foo,bar}的列表,您可以使用它来组装参数列表

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();
 });

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

您可以在较旧版本的visual studio中使用C6功能

本质上,只是使用

Install-Package Microsoft.Net.Compilers

在所有项目上。

您可以在较旧版本的visual studio中使用C6功能

本质上,只是使用

Install-Package Microsoft.Net.Compilers

在所有项目上。

您知道您还需要考虑{{和}}文字大括号吗?这不是正则表达式解析代码的最佳工作。相关:也告诉他配置他的VS版本,这样代码就不会使用C6特性。这是可能的。像string.Format$alpha:{alphaID},{0},betaValue:{1}{beta.Value},varOne,varTwo这样的东西应该如何处理?你知道你还需要考虑{{和}}文字大括号吗?这不是正则表达式解析代码的最佳工作。相关:也告诉他配置他的VS版本,这样代码就不会使用C6特性。这是可能的。像字符串.Format$alpha:{alphaID},{0},betaValue:{1}{beta.Value},varOne,varTwo这样的东西应该如何处理?我认为这种格式错误的PCRE正则表达式在C中没有多大帮助。没关系,我可以在notepad++或其他正则表达式替代工具中输入代码并运行它。我将去掉\gU并在加号后插入惰性运算符。我不认为这个格式错误的PCRE正则表达式在C中有多大帮助。没关系,我可以在notepad++或其他正则表达式替换工具中输入代码并运行它。我将删除\gU并在加号后插入惰性运算符。