Найти и заменить вопрос RegEx - PullRequest
3 голосов
/ 11 мая 2010

Я начинаю понимать RegEx, благодаря огромной помощи, которую я получил на SO по другим моим вопросам. Но я все еще отстой в этом:

Мой код:

   StreamReader reader = new StreamReader(fDialog.FileName.ToString());
   string content = reader.ReadToEnd();
   reader.Close();


Я читаю в текстовом файле и хочу найти этот текст и изменить его (значения X и Y всегда следуют друг за другом в моем текстовом файле):

X17.8Y-1.

Но этот текст также может быть X16.1Y2.3 (значения всегда будут отличаться после X и Y)


Я хочу изменить это на

X17.8Y-1.G54
или
Х (значение) Y (значение) G54 * ** 1022 тысяча двадцать-один *

Мой оператор RegEx следует, но он не работает.

content = Regex.Replace(content, @"(X(?:\d*\.)?\d+)*(Y(?:\d*\.)?\d+)", "$1$2G54");


Может кто-нибудь изменить его для меня, чтобы он работал, и будет искать X (подстановочный знак) Y (подстановочный знак) и заменить его X (значение) Y (значение) G54?

Ответы [ 5 ]

2 голосов
/ 11 мая 2010

Вам нужно регулярное выражение:

X[-\d.]+Y[-\d.]+

Вот как это использовать в C #:

string content = "foo X17.8Y-1. bar";
content = Regex.Replace(content, @"X[-\d.]+Y[-\d.]+", "$0G54");
Console.WriteLine(content);

Выход:

foo X17.8Y-1.G54 bar
1 голос
/ 11 мая 2010

Что следует за "X (значение) Y (значение)" в вашем текстовом файле? Пространство? Новая строка? Другая пара значений "X (значение) Y (значение)"?

Я не очень хорошо использую ярлыки в регулярных выражениях, например \ d, и я не знаком с .NET, но я использовал следующее регулярное выражение для сопоставления пары значений:

(X[0-9.-]+Y[0-9.-]+)

И замена

$1G54

Это будет работать до тех пор, пока за парой значений непосредственно не следует цифра, точка или тире.

1 голос
/ 11 мая 2010

Чтобы быть разборчивым во вводе, вы можете использовать

string num = @"-?(?:\d+\.\d+|\d+\.|\.\d+|\d+)";
content = Regex.Replace(content, "(?<x>X" + num + ")(?<y>Y" + num + ")", "${x}${y}G54");

Есть ли надежный терминатор для значения Y? Скажите, что это пробел:

content = Regex.Replace(content, @"(X.+?)(Y.+?)(\s)", "$1$2G54$3");

Насколько надежным должен быть код? Если это перезаписывает вывод отладочной информации или какую-то другую быстро выполняемую задачу, сделайте это просто.

0 голосов
/ 11 мая 2010

Похоже, вам просто нужно поддерживать необязательные отрицательные значения:

content = Regex.Replace(content, @"(X-?(?:\d*\.)?\d+)*(Y-?(?:\d*\.)?\d+)", "$1$2G54");
0 голосов
/ 11 мая 2010

Я знаю, что это не отвечает на ваш вопрос напрямую, но вы должны проверить Expresso . Это инструмент регулярных выражений .NET, который позволяет вам отлаживать, тестировать и точно настраивать сложные выражения. Это спасатель.

Больше ответом "сделай сам", но это будет полезно, даже если кто-то даст тебе ответ.

...