Я хочу заменить целые десятичные числа, за которыми не следует pt, на M.

Например, мне нужно заменить 1, 12 и 36.7, но не 45.63 в следующем.

string exp = "y=tan^-1(45.63pt)+12sin(-36.7)";

Я уже пробовал

string newExp = Regex.Replace(exp, @"(\d+\.?\d*)(?!pt)", "M");

И это дает

"y=tan^-M(M3pt)+Msin(-M)"

Мне понятно, почему это работает, но мне нужно

"y=tan^-M(45.63pt)+Msin(-M)"
3
Mehdi 17 Янв 2021 в 11:14

3 ответа

Лучший ответ

Проблема с регулярным выражением заключается в том, что оно все еще соответствует части десятичного значения 45.63, вплоть до предпоследней десятичной цифры. Одним из решений является добавление к шаблону отрицательного опережающего просмотра, чтобы гарантировать, что мы устанавливаем только (?!pt) в реальном конце каждого десятичного значения. Эта версия работает:

string exp = "y=tan^-1(45.63pt)+12sin(-36.7)";
string newExp = Regex.Replace(exp, @"(\d+(?:\.\d+)?)(?![\d.])(?!pt)", "M");
Console.WriteLine(newExp);

Это печатает:

y=tan^-M(45.63pt)+Msin(-M)

Вот объяснение используемого шаблона регулярного выражения:

(               match and capture:
    \d+         one or more whole number digits
    (?:\.\d+)?  followed by an optional decimal component
)               stop capturing
(?![\d.])       not being followed by another digit or dot
(?!pt)          not followed by pt
2
Tim Biegeleisen 17 Янв 2021 в 08:35

Я думаю, вы можете утверждать точку в строке, где нет цифр и точек, за которыми непосредственно следует "pt":

(?![\d.]+pt)\d+(?:\.\d+)?

См. Интерактивную демонстрацию


  • (?![\d.]+pt) - отрицательный просмотр вперед для 1+ цифр и точек, за которыми следует "pt".
  • \d+ - 1+ цифр.
  • (?: - открытая группа без захвата:
    • \.\d+ - буквальная точка и 1+ цифр.
    • )? - Закройте группу без захвата и сделайте ее необязательной.

См. .NET демонстрация

0
JvdV 17 Янв 2021 в 08:46

Привет, если вам нужен вывод как

   "y=tan^-M(Mpt)+Msin(-M)"

Тогда newExp должен быть

   string newExp = Regex.Replace(exp, @"(\d+\.?\d*)", "M");

Если вывод

 "y=tan^-M(45.63pt)+Msin(-M)"

Тогда newExp должен быть

 string newExp = Regex.Replace(exp, @"(\d+\.?\d*)(?![.\d]*pt), "M");
0
sai kiran 17 Янв 2021 в 09:47
65758521