2010-05-10 1 views
3

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

Мой код:

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


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

X17.8Y-1.

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


Я хочу, чтобы изменить его к этому

X17.8Y -1.G54
или
Х (значение) Y (значение) G54



Записывается инструкция RegEx, но она не работает.

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


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

ответ

2

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

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 
+0

Работает идеально. Огромное спасибо. – fraXis

+0

или 'X [0-9 .-] + Y [0-9 .-] +' – Armstrongest

+0

Теперь это также соответствует строкам типа '" X-17--2..3.-Y -... 1. " ', который я не думаю, что он хочет. Его исходное регулярное выражение в своем вопросе специально отфильтровывает нечисловые выражения (оно принимает только числа, такие как .5 или 2.3 или 44). Разве это не приведет к ложным срабатываниям? –

0

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

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

+0

Awesome. Спасибо за совет. – fraXis

0

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

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

При запуске на тестовом примере это дает выход '' foo X17.8Y-1G54. Bar "'. –

+0

@Mark Byers: см. Мой комментарий к вашему ответу, но да, мой неверен. Я основывал его на исходном регулярном выражении и просто добавил поддержку негативов. Были и другие проблемы с исходным регулярным выражением. Ответ gbacon является наиболее точным. –

1

Чтобы быть требователен к входу, вы можете использовать

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"); 

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

1

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

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

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

и замена is

$1G54 

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

+0

Я для огромного поклонника синтаксиса '[0-9]' над '\ d'. Это гораздо более читаемо и с регулярными выражениями, НИЧЕГО, что улучшает читаемость - это хорошо. – Armstrongest