Saya ingin mengganti angka desimal "seluruh" yang tidak diikuti oleh pt dengan M.

Misalnya, saya perlu mengganti 1, 12, dan 36.7, tetapi tidak 45.63 berikut ini.

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

Saya sudah mencoba

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

Dan itu memberi

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

Masuk akal bagi saya mengapa ini bekerja seperti ini, tetapi saya harus mendapatkannya

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

2 jawaban

Jawaban Terbaik

Masalah dengan ekspresi reguler adalah masih cocok dengan sebagian dari nilai desimal 45.63, hingga digit desimal kedua hingga terakhir. Salah satu solusinya adalah menambahkan pandangan ke depan negatif ke pola untuk memastikan bahwa kita hanya menegaskan (?!pt) pada akhir sebenarnya dari setiap nilai desimal. Versi ini berfungsi:

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

Ini mencetak:

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

Berikut penjelasan pola regex yang digunakan:

(               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
4
Tim Biegeleisen 17 Januari 2021, 08:35

Halo jika Anda membutuhkan out put sebagai

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

Maka newExp seharusnya

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

Jika keluarannya adalah

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

Maka newExp seharusnya

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