Регулярное выражение обычно не может делать вычисления, но оно может помочь вам захватить число. Вы можете использовать обратный вызов замены. Вот C #, например:
Вспомогательный метод (мы могли бы использовать лямбду, но он менее красив):
public string CalculateNumber(Match match)
{
int i = Convert.ToInt32(match.Value);
i = i * 2 - 1;
return i.ToString();
}
Regex заменяет:
String fileName = "filename23.pdf";
fileName = Regex.Replace(fileName, @"\d+", CalculateNumber);
Важным примечанием здесь является то, что строка может представлять слишком большое целое число (поэтому она не будет анализироваться). Кроме того, i*2-1
может переполниться, что приведет к отрицательному числу. Вы можете использовать checked
блок или BigInteger
(с .Net 4).