我对字符串运行重复的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”。根本不会更改-尽管它存在于数组中并通过调试,但是我看到它正在传递给regex /,但不会更改/。
到底如何替换某些变量而其他变量却没有替换呢?
在数组VarsAndValues中,变量的顺序很重要,因为如果“ TOSP”是第一个,它将被替换而“&TO”则不是,而如果“ TO”是第一个,它将被替换,而“&TOSP”则不替换。因此,我怀疑Regex.Replace不能以某种方式对同一字符串中的相似表达式/变量进行重复替换,或者无法识别要替换的变量/表达式-但我认为第一种可能性没有理由,而第二种是这是不可能的,因为被替换的表达式显然会停留在该位置。
//注意-我知道这肯定不是很好的编码,但是它比我编写的为节省我数周的手工工作编写的单一目的脚本
最佳答案
我没发现您的正则表达式有什么问题。但是,为什么只迭代一半的VarsAndValues
?
for(int Fa=0;Fa<VarsAndValues.Length/2;++Fa)
告诉我您要在数组中途停止,所以如果
TOSP
恰好在下半段下降,它将不会被替换。