2011-02-01 15 views
2

文字列に対してRegex.Replaceを繰り返し実行し、特定の「変数」を「値」に置き換えます。何かが交換され、いくつかはしない!
特定のバッチファイル(正確にはIBM JCLバッチ言語)を分析し、JCL変数を検索する必要があります(ルール:JCL変数は "&"で始まり、スペースで終了します) "、"; ""開始、それは "&")です。私の関数は、文字列を変数と変数とその配列の配列を入力として取ります。その文字列を検索し、JCL変数をその値で置き換えます。そうです、私はforcycleを実行して、配列内の各値は、変数の構造体のために、私は防ぐためにRegex.Replace を(実行「& TOSPを。」を紛失された「& TO。」とJCLのVaRのルールに準拠し、上記参照)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。これらが充填されていない - それは(無視& MESは、& DENがなければならないとして& DEN..V & VER.K99 SP.COPY.DBA0.SPPROD.BVSIN.SAVEC.D & MESDENV & VER.K99に変更されますValsAnd値配列内にあり、したがって置換されない)であるが、
&からです。。@ ZDSK99.PODVYP.M & MES.U & DEN..SUC.RES、 "& TO。"全く変更されていません - 配列にもデバッグによっても存在しますが、正規表現に渡されていますが、変更されません。

どうすればいいですか SOME変数が置き換えられ、はありませんか?配列VarsAndValuesで 、変数の順番に、「TOSPは」最初であれば、それは置き換えられますと、まず、それが置き換えられますし、「& TOSPは」ないさ「を」場合ながら「&を」、しませんので。したがって、私はRegex.Replaceが同じ文字列内の類似の式/変数を何度か置き換えるのに失敗したり、置き換えられる変数/式を認識できないことに疑念を抱いていますが、最初の可能性はないと思います。置き換えられた表現が明らかにそこにとどまるので、不可能です。 //注 - それは確かに良いコーディングではないことは分かっていますが、私は手作業の何週間も節約するために書いた単目的のスクリプトです。

答えて

2

あなたの正規表現には何も間違いはありません。しかし、なぜあなたはVarsAndValuesの半分以上を反復していますか?

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

あなたは、配列の途中で停止しているので、TOSPは後半に落ちてしまった場合、それは置き換えられません私に語りました。

+1

ありがとう、それは今動作します。 (私は実際には2D配列[したがってLenght/2]からJCLvar構造体に戻って、他の症状を考えて、残ったものを実現するにはあまり目に見えませんでした。日) – cover72

関連する問題