我運行重複Regex.Replace過的字符串,與他們的「值」代替某些「變量」。事情是,有些被取代,有些不是!
我必須分析某些批處理文件(準確地說是IBM JCL批處理語言)並在其中搜索JCL變量(規則:JCL變量以「&」開始並以空格結束;「」「」「或其他變量開始,即「&」)。我的函數應該把帶有變量和變量數組的字符串作爲輸入;然後搜索字符串並用它們的值替換JCL變量。所以我運行一個forcycle以及在陣列中的每個值可變結構,我運行Regex.Replace (爲了防止「& TOSP。」被放錯位置爲「& TO」並粘附到JCL變種的規則,參見上面):C#Regex.Replace(或與string.replace)僅部分地工作
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值陣列中,因此不會被替換),但在
& TO。。@ ZDSK99.PODVYP.M & MES.U & DEN..SUC.RES的 「& TO」。根本不會改變 - 雖然它存在於數組中,並且通過調試,但我發現它正在傳遞給正則表達式/但它不會被改變/。
它是怎麼來的有的變量被取代和其他不? 在陣列VarsAndValues,變量事項順序,如果「TOSP」首先是因爲,它被替換和「& TO」沒有,而如果「TO」是第一次,它就會被取代,「& TOSP」沒有;因此,我懷疑Regex.Replace不知何故未能重複相同的字符串替換類似表述/變量做什麼或不能識別變量/表達式替換 - 但我看不出有任何理由對第一種可能性,第二個是因爲被取代的表達式顯然停留在那裏。 //注 - 我知道這當然不是很好的編碼,但它更像是一個單一用途的腳本,我爲了節省幾周的手動工作而不是其他任何東西
非常感謝,現在有效。 (我實際上已經從2D數組[從而Lenght/2]恢復到JCLvar結構,並考慮到其他症狀,我太盲目瞭解這個剩餘部分。猜猜我只需要一個獨立的代碼審查 - 我被這個問題困住了天) – cover72 2011-02-01 12:16:58