Я написал утилиту, которая открывает текстовый файл, загружает как строку и выполняет функцию поиска/замены, используя RegEx.Replace
.Regex.Replace с большими строками и обратными косыми чертами
Он делает это во многих файлах, пользователь указывает его в папку, вводит строку поиска, заменяет строку и все файлы в папке, содержащие строку в файле, заменяются.
Это отлично работает, пока я не попробую его с обратной косой чертой, где он падает.
Довольно просто:
newFileContent = Regex.Replace(fileContent, @findString, @replaceString, RegexOptions.IgnoreCase);
fileContent = содержимое файла на основе текста. он будет содержать возврат каретки.
FindString = введен пользователь строка для поиска
replaceString = введенный пользователя строки, чтобы заменить найденную строку с
Я пытался добавить некоторую логику, чтобы противостоять действовать обратные косые черты, как показано ниже, но это не удается с незаконным в конце рисунка.
if (culture.CompareInfo.IndexOf(findString, @"\") >= 0)
{
Regex.Replace(findString, @"\", @"\\");
}
Что нужно сделать, чтобы успешно справиться с обратными косыми чертами, чтобы они могли быть частью логики поиска/замены?
Полный блок кода ниже.
//open reader
using (var reader = new StreamReader(f,Encoding.Default))
{
//read file
var fileContent = reader.ReadToEnd();
Globals.AppendTextToLine(string.Format(" replacing string"));
//culture find replace
var culture = new CultureInfo("en-gb", false);
//ensure nothing has changed
if (culture.CompareInfo.IndexOf(fileContent, findString, CompareOptions.IgnoreCase) >= 0)
{
//if find or replace string contains backslahes
if (culture.CompareInfo.IndexOf(findString, @"\") >= 0)
{
Regex.Replace(findString, @"\", @"\\");
}
//perform replace in new string
if (MainWindow.Main.chkIgnoreCase.IsChecked != null && (bool) MainWindow.Main.chkIgnoreCase.IsChecked)
newFileContent = Regex.Replace(fileContent, @findString, @replaceString, RegexOptions.IgnoreCase);
else
newFileContent = Regex.Replace(fileContent, @findString, @replaceString);
result[i].Result = true;
Globals.AppendTextToLine(string.Format(" success!"));
}
else
{
Globals.AppendTextToLine(string.Format(" failure!!"));
break;
}
}
Некоторые пищу для размышлений: Что делать, если положить файл в папке с размером, превышающим объем памяти, который у вас есть? В настоящее время ваше решение не удастся. Возможно, вам следует выполнять замену по очереди, а не по всему файлу сразу. –
Позволяет пользователю вводить строку регулярных выражений, как правило, плохую идею, так как они могут легко стрелять в ногу. Исключением может быть инструмент dev, на котором пользователь должен знать, что это регулярное выражение заранее, и быть достаточно осведомленным, чтобы избежать их обратных косых черт. Неспециалист, выполняющий регулярное выражение, не является чем-то, что будет работать, и вам следует, вероятно, пересмотреть ваш подход. – McAden
Приложите обратную связь, однако это инструмент поддержки для технической справочной службы. – Damo