Всем привет! Столкнулся со следующей задачей. Есть документ формата txt
7200
20 1 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
0 0 0 0 0
2.570136 2.51 2.63
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
20 2 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
0 0 0 0 0
2.572938 2.51 2.63
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
20 3 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
0 0 0 0 0
2.615161 2.57 2.65
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1
В первой строке число 7200 - т.е. это количество блоков. Далее есть строки
20 1 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
20 2 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
20 3 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
и т.д. 7200 раз
Вот в этих строках мне нужно заменить цифру 20 на цифру 160 Прошу помощи.
Ну вот вам регулярное выражение, которое ищет "20", которое стоит в начале строки, а после него следует ровно 8 групп из символов цифр, знаков +-, точки или буквы E разделенных пробелом и с переводом строки: (?<=^)20(?=( [0-9\-\+E\.]+){8}\r?$)
Проверить можно так:
var input = @"7200
20 1 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
0 0 0 0 0
2.570136 2.51 2.63
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
0.15013 0 0 2.570136 -3.4E+038 3.4E+038 1 1
20 2 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
0 0 0 0 0
2.572938 2.51 2.63
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
0 -1.425686 0 2.572938 -3.4E+038 3.4E+038 1 1
20 3 4 -65 -25 1000 -1000 -3.4E+038 3.4E+038
0 0 0 0 0
2.615161 2.57 2.65
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1
-1.425686 -2.708803 0 2.615161 -3.4E+038 3.4E+038 1 1";
var pattern = @"(?<=^)20(?=( [0-9\-\+E\.]+){8}\r?$)";
var replacement = "160";
var result = Regex.Replace(input, pattern, replacement, RegexOptions.Multiline);
Console.WriteLine(result);
Для загрузки входной строки из файла используйте File.ReadAllText, а для записи File.WriteAllText, итого ваш код будет выглядеть так:
var filename = "...";
var input = File.ReadAllText(filename);
var pattern = @"(?<=^)20(?=( [0-9\-\+E\.]+){8}\r?$)";
var replacement = "160";
var result = Regex.Replace(input, pattern, replacement, RegexOptions.Multiline);
File.WriteAllText(filename, result);
Универсальный шаблон, если число, которое необходимо заменить, может быть любым (целым неотрицательным):
var pattern = @"(?<=^)\d+(?=( [\d\-\+E\.]+){8}\r?$)";
Сборка персонального компьютера от Artline: умный выбор для современных пользователей