2011-02-01 2 views
2

Я запускаю повторное Regex.Replace поверх строки, заменяя определенные «переменные» их «значениями». Дело в том, что некоторые заменяются, а некоторые нет!
Мне нужно проанализировать некоторые командные файлы (точнее, командный язык IBM JCL) и искать их для переменных JCL. (правила: JCLvariable начинается с «&» и заканчивается пробелом: «,»; ». Или другая переменная начало, что «&»). Предполагается, что мои функции берут строку с переменными и массивом переменных и их значений в качестве входных данных; затем выполните поиск строки и замените переменные JCL на их значения. Так что я запускаю forcycle и для каждой переменной переменной struct в массиве, я запускаю 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" 

Объединение, что и это должно привести к "СП & APL." часть меняется на «SPPROD».

Проблема, только некоторые из переменных заменяются: & ТОСПА.. КОПИ. & СИСТЕМА..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." не изменяется вообще - хотя он существует в массиве и через отладку, я вижу, что он передается в regex /, но он не изменяется /.

Как это происходит НЕКОТОРЫЕ переменные заменяются и другие нет? В массиве VarsAndValues ​​имеет место порядок переменных, потому что, если «TOSP» является первым, его заменяют, и «& TO« нет, тогда как если «TO» является первым, его заменяют, а «& TOSP» - нет; поэтому у меня возникло подозрение, что Regex.Replace каким-то образом не выполняет повторной замены на аналогичные выражения/переменные в той же строке ИЛИ не может распознать заменяемую переменную/выражение, но я не вижу причин для первой возможности, а второй невозможно, так как замененные выражения явно остаются там. // Примечание. Я знаю, что это, конечно, не очень хорошее кодирование, но это более уникальный сценарий, который я написал, чтобы сэкономить несколько недель ручной работы, чем что-либо еще.

ответ

2

Я не вижу ничего плохого в вашем регулярном выражении. Но почему вы повторяете только половину VarsAndValues?

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

говорит мне, что вы останавливаете на полпути через массив, так что если TOSP происходит падение во второй половине, он не будет заменен.

+1

Спасибо большое, сейчас он работает. (Я фактически вернулся к структуре JCLvar из 2D-массива [таким образом, Lenght/2] и думал о других симптомах, я был слишком слеп, чтобы реализовать это. Думаю, мне просто нужен независимый обзор кода. Я застрял в этой проблеме за день) – cover72

Смежные вопросы