为清楚起见,在我开始提问之前,我有一些示例C代码,我正在尝试使用C#正则表达式进行修改。我不是在问有关C的问题,我只是在使用C#使用正则表达式自动生成C文件。
我正在尝试编写一个正则表达式,它将替换两个匹配字符串(标签)之间的子字符串。我跟随this question,但是我认为我失败了,因为我的“标签”采用了C样式的块注释(在正则表达式中有反斜杠和星号)。最终,它将用于自动替换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#*/;
答案 0 :(得分:1)
我注意到您的示例中出现白色间距问题,而正则表达式中出现转义字符,这可能是导致问题的两个原因。
因此,对于“ ModelNumber”的具体示例:
(?<=/\*\s*(#ModelNumber#)\s*\*\/)(.+)(?=/\*\s*\k<1>\s*\*/)
resultString = Regex.Replace(subjectString, @"(?<=/\*\s*(#ModelNumber#)\s*\*\/)(.+)(?=/\*\s*\k<1>\s*\*/)", " new value ");
(?<=/\*\s*(#ModelNumber#)\s*\*\/)
/
匹配字符“ /” \*
匹配字符“ *” \s*
*
(#ModelNumber#)
中
#ModelNumber#
\s*
*
\*
匹配字符“ *” \/
匹配字符“ /” (.+)
中
.+
+
(?=/\*\s*\k<1>\s*\*/)
/
匹配字符“ /” \*
匹配字符“ *” \s*
*
\k<1>
\s*
*
\*
匹配字符“ *” /
匹配字符“ /” \k<1>
部分。这将起作用:
/*#ModelNumber#*/ /*#ModelNumber#*/
这不会:
/*#ModelNumber#*//*#ModelNumber#*/