2011-02-01 52 views
2

我運行重複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不知何故未能重複相同的字符串替換類似表述/變量做什麼或不能識別變量/表達式替換 - 但我看不出有任何理由對第一種可能性,第二個是因爲被取代的表達式顯然停留在那裏。 //注 - 我知道這當然不是很好的編碼,但它更像是一個單一用途的腳本,我爲了節省幾周的手動工作而不是其他任何東西

回答

2

我沒有看到你的正則表達式有什麼問題。但爲什麼你只重複了VarsAndValues的一半?

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

告訴我你在中途停止通過數組,所以如果TOSP正巧落在下半年,它不會被取代。

+1

非常感謝,現在有效。 (我實際上已經從2D數組[從而Lenght/2]恢復到JCLvar結構,並考慮到其他症狀,我太盲目瞭解這個剩餘部分。猜猜我只需要一個獨立的代碼審查 - 我被這個問題困住了天) – cover72 2011-02-01 12:16:58