C#Regex.Replace(或String.Replace)只能部分工作

时间:2011-02-01 10:06:02

标签: c# regex

我在一个字符串上运行一个重复的Regex.Replace,用它们的“值”替换某些“变量”。事情是,有些人得到了更换,有些则没有! 我必须分析某些批处理文件(准确地说是IBM JCL批处理语言)并搜索它们以寻找JCL变量(规则:JCL变量以“&”开头并以空格结尾;“,”;“。”或其他变量start,即“&”)。我的函数应该将带有变量和变量数组及其值的字符串作为输入;然后搜索字符串并用它们的值替换JCL变量。因此,我运行一个for循环,对于数组中的每个值变量结构,我运行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;
}

EG。我把它作为要替换的字符串:

string _DSN = "&TOSP..COPY.&SYSTEM..SP&APL..BVSIN.SAVEC.D&MES.&DEN..V&VER.K99";

然后我有一个包含变量和值对的结构数组,例如。

JCLvar[1].variable = "APL",JCLvar[1].value = "PROD"

结合它,它应该导致“SP&amp; APL”。部分改为“SPPROD”。

问题是,只有一些变量被替换: &amp; TOSP。 .COPY。&amp; SYSTEM..SP&amp; APL..BVSIN.SAVEC.D&amp; MES。&amp; DEN..V&amp; VER.K99 获取改为 SP.COPY.DBA0.SPPROD.BVSIN.SAVEC.D&amp; MESDENV&amp; VER.K99 因为它应该(忽视&amp; MES,&amp; DEN-这些都没有填写ValsAnd Values数组,因此不会被替换),但在中 &amp; TO。。@ ZDSK99.PODVYP.M&amp; MES.U&amp; DEN..SUC.RES ,“&amp; TO”。根本没有改变 - 尽管它存在于数组中并通过调试,我看到它被传递给正则表达式/但它没有被更改/.

它是怎么回事有些变量被替换而其他没有? 在数组VarsAndValues中,变量的顺序很重要,因为如果“TOSP”是第一个,它会被替换,而“&amp; TO”则不会,而如果“TO”是第一个,它将被替换,“&amp; TOSP”不会;因此,我怀疑Regex.Replace以某种方式无法在相同的字符串中重复替换类似的表达式/变量或者无法识别要替换的变量/表达式 - 但我认为没有理由第一种可能性而第二种可能性是不可能,因为被替换的表达清楚地留在那里。 //注意 - 我知道这肯定不是很好的编码,但它更像是一个单一用途的脚本,我写的是为了节省数周的手工工作而不是其他任何东西

1 个答案:

答案 0 :(得分:2)

我认为你的正则表达式没有任何问题。但是为什么你只迭代VarsAndValues的一半?

for(int Fa=0;Fa<VarsAndValues.Length/2;++Fa)

告诉我你正在数组的中途停止,所以如果TOSP恰好落入下半场,它将不会被替换。