【发布时间】:2011-02-01 18:45:35
【问题描述】:
我在一个字符串上运行一个重复的 Regex.Replace,用它们的“值”替换某些“变量”。问题是,有些会被替换,有些不会!
我必须分析某些批处理文件(准确地说是 IBM JCL 批处理语言)并在其中搜索 JCL 变量 (规则:JCLvariable 以“&”开头并以空格结尾;“”;“。”或其他变量开始,即“&”)。我的函数应该将带有变量的字符串和变量及其值数组作为输入;然后搜索字符串并用它们的值替换 JCL 变量。所以我运行了一个forcycle,并且对于数组中的每个值变量结构,我运行Regex.Replace (为了防止“&TOSP.”被“&TO”错位,并遵守JCL var规则,见上文):
private string ReplaceDSNVarsWithValues(string _DSN,JCLvar[] VarsAndValues)
{
//FIXME: nefunguje pro TIPfile a nebere všechny &var
for(int Fa=0;Fa<VarsAndValues.Length/2;++Fa)
{
_DSN = Regex.Replace(_DSN, "&"+VarsAndValues[Fa].JCLvariable+"[^A-Za-z0-9]", VarsAndValues[Fa].JCLvalue);
}
return _DSN;
}
例如。我将其作为要替换的字符串:
string _DSN = "&TOSP..COPY.&SYSTEM..SP&APL..BVSIN.SAVEC.D&MES.&DEN..V&VER.K99";
然后我有一个结构数组,其中包含几个变量和值,例如。
JCLvar[1].variable = "APL",JCLvar[1].value = "PROD"
结合起来,它应该会产生“SP&APL”。部分更改为“SPPROD”。
问题是,只有一些变量被替换:
&TOSP..COPY.&SYSTEM..SP&APL..BVSIN.SAVEC.D&MES.&DEN..V&VER.K99 更改为 SP.COPY.DBA0.SPPROD .BVSIN.SAVEC.D&MESDENV&VER.K99 应该(忽略 &MES,&DEN - 这些未填充在 ValsAnd Values 数组中,因此不会被替换),但在
&TO..@ZDSK99.PODVYP.M&MES.U&DEN..SUC.RES,“&TO”。根本没有改变 - 虽然它存在于数组中并通过调试,但我看到它正在传递给正则表达式/但它没有改变/。
SOME 变量怎么会被替换而其他 不会? 在数组 VarsAndValues 中,变量的顺序很重要,因为如果“TOSP”在前,它会被替换而“&TO”不会,而如果“TO”在前,它会被替换而“&TOSP”不会;因此,我怀疑 Regex.Replace 以某种方式无法对同一字符串中的类似表达式/变量进行重复替换,或者无法识别要替换的变量/表达式 - 但我认为第一种可能性没有理由,而第二种可能性是不可能,因为被替换的表达式显然保留在那里。 //注意 - 我知道这肯定不是很好的编码,但它更像是我编写的一个单一用途的脚本,以节省我数周的手动工作而不是其他任何东西
【问题讨论】: