C# Regex.Replace(或 String.Replace)仅部分有效

标签 c# regex

我对一个字符串运行重复的 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”。根本没有改变 - 虽然它存在于数组中并且通过调试,我看到它正在传递给正则表达式/但它没有改变/。

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

最佳答案

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

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

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

关于C# Regex.Replace(或 String.Replace)仅部分有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4861206/

相关文章:

c# - 从 ListBox 中删除项目时,每个循环都不起作用

c# - 正则表达式得到一个字符后面没有数字

javascript - Django urlpatterns 正则表达式不精确,得到 404?

c# - 为什么 ValueType.GetHashCode() 是这样实现的?

C# Windows 服务 While 循环

c# - 检测具有相同 child 的实体

c# - 如何设计包含大量 IF 或 Switch 语句的方法

regex - 去除单个字母之间的空格

c# - 我可以进一步优化我的正则表达式吗?或者我做得对吗?

javascript - 正则表达式:如何找到以 Ä,Ö,Ü ... 开头的单词?