【发布时间】:2019-09-27 16:48:05
【问题描述】:
在我开始提问之前,为了清楚起见,我有示例 C 代码,我正在尝试使用 C# 正则表达式进行修改。我不是在问关于 C 的问题,我只是在使用 C# 使用正则表达式自动生成 C 文件。
我正在尝试编写一个正则表达式,它将替换两个匹配字符串(标签)之间的子字符串。我跟着this question,但我认为我失败了,因为我的“标签”采用 C 样式块 cmets 的形式(它具有反斜杠和星号,它们是正则表达式中的特殊字符)。最终,这将用于自动替换 C 源文件中的某些值。
这是我的一些 C 代码的示例:
SetKeyString("modelNumber", /* #ModelNumber#*/ config.modelNumber /*#ModelNumber#*/);
config.maxKV = /*#MaxKV#*/ 88.88 /*#MaxKV#*/;
我想用从 XML 文件外部获取的新值替换 config.modelNumber 和 88.88。
假设我的 XML 文件中的数据是:
<ModelNumber>ABCDE</ModelNumber>
<MaxKV>99.99</MaxKV>
生成的 C 代码应该是
SetKeyString("modelNumber", /*#ModelNumber#*/ ABCDE /*#ModelNumber#*/);
config.maxKV = /*#MaxKV#*/ 99.99 /*#MaxKV#*/;
这是我目前用来尝试(但不幸失败)的正则表达式。
string x = Regex.Replace(mainLines[i], @String.Format(@"?<=/*#{0}#*/)(\w+?)(?=/*#{0}#*/)", property.Name), "middle");
mainLines 是我的 C 文件的各个行,property.Name 是 XML 标记的名称:ModelNumber 或 MaxKV(末尾没有任何字符)。
更新 - 其他示例
在对提议的解决方案进行进一步测试期间发现了失败的边缘情况,因此这里是导致失败的其他示例输入:
config.kvRampRate = /*#KVRampRate#*/ (10.0 / config.maxKV * 4095) / 12.124567719929887 /*#KVRampRate#*/;
config.maRampRate = /*#MARampRate#*/ 1.0/config.maxMA * 4095 / /*mARampRate-->*/87.80017152658661 /*#MARampRate#*/;
【问题讨论】:
-
您可以在正则表达式中使用反斜杠转义特殊字符:
\*。您不想要零个或多个斜杠的序列,这就是您要匹配的内容:/*。你想要一个斜线后跟一个星号:/\*。 -
这不是您问题的直接答案,但这是我在制作正则表达式时使用的。它使制作您可能想要的大多数正则表达式语句变得超级简单。 txt2re.com/index-csharp.php3
-
斜杠 '/' 不是 C# 正则表达式中的特殊字符,但星号 '*' 是(在所有正则表达式中)。