Я не являюсь сторонником такого кода, в котором нарисован единственный регэксп в пару-тройку-другую сотен символов длиною, который не в подъём уму уразуметь...
МЦ В глухих закоулках нашего приложения наткнулся на маленький шедевр.
Было (комменты мои):
MatchCollection parts = regex.Matches(Formula.FormulaBody);
// Гм...
if(sex.ToLower() == "male" && parts.Count!=0)
res = parts[0].Value;
else if( sex.ToLower() == "female" && parts.Count!=0 && parts.Count > 1)
res = parts[1].Value;
бла-бла-бла
// Этот код должен всего лишь заменить все вхождения типа [var_name] на значение переменной....
foreach (string str in calc.Variables.Keys)
{
Measurement mes = MeasurementByName(str);
if (mes == null || mes.ShortName == "") continue;
while (res.IndexOf(str)>-1)
{
int ind = res.IndexOf(str);
if (res[ind-1] == '[' && res[ind+(str).Length]==']')
{
res = res.Remove(ind,(str).Length);
res = res.Insert(ind,mes.ShortName);
}
}
}
бла-бла-бла
// А все что ниже должно разбавить указанные символы пробелами...
ArrayList places = new ArrayList();
ArrayList places = new ArrayList();
for (int i = 0;i {
/// ААААААААААААААААА!!!!!
if (res[i]=='*'||res[i]=='/'||res[i]=='+'||res[i]=='-'||res[i]=='('||res[i]==')')
{
places.Add(i);
}
}
for (int j = places.Count-1;j>=0;j--)
{
if ((int)places[j]+1 if ((int)places[j]>0) res = res.Insert((int)places[j]," ");
}
Я немного причесал код и получлось вот что:
int idx = (sex.ToLower() == "male") ? 0 : 1;
if(idx<=parts.Count) res = parts[idx].Value;
}
Calculator calc = new Calculator(res);
foreach (string str in calc.Variables.Keys)
{
Measurement mes = MeasurementByName(str);
if (mes == null || mes.ShortName == "") continue;
res = res.Replace(string.Format("[{0}]", str), mes.ShortName);
}
string symbols = "*/+-()";
System.Text.StringBuilder sb = new System.Text.StringBuilder("");
for (int i = 0;i {
string cur = ((symbols.IndexOf(res[i]) >= 0) ? string.Format("[{0}]", res[i]) : new string(res[i]));
sb.Append(cur);
}
res = sb.ToString().Trim();
Хотя последнее можно было бы и регекспом сделать, но лень..