/// <summary> /// Замена выражения типа asdf*ghjk на qwer (где * - любое количество символов) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonReplace_Click(object sender, EventArgs e) { statusStrip1.Items[0].Text = ""; Application.DoEvents(); if (comboFind.Text == "") { comboFind.Focus(); statusStrip1.Items[0].Text = "Строка для поиска не задана"; return; } // // Запоминание введённых значений для поиска и замены в реестре // m_ActClass.AddValue("qrFindVals", comboFind.Text); LoadComboBoxList(comboFind, "qrFindVals"); if (comboFind.Items.Count > 0) { comboFind.Text = comboFind.Items[0].ToString(); } m_ActClass.AddValue("qrReplaceVals", comboReplace.Text); LoadComboBoxList(comboReplace, "qrReplaceVals"); if (comboReplace.Items.Count > 0) { comboReplace.Text = comboReplace.Items[0].ToString(); } statusStrip1.Items[0].Text = ""; var textBuilder = new StringBuilder(m_MainForm.textWindow.Text); // // Если используются рег. выражения - то разбираем строку для их поиска и корректной обработки // int cntRepl = 0; if (checkUseRegular.Checked) { // // Замена символов вида \n в строке для поиска на спец. символы перевода строки // var arrPart = new ArrayList(); string textFind; try { textFind = ParseSmartString(comboFind.Text); } catch (WrongSmartStringException ex) { statusStrip1.Items[0].Text = ex.Message + " для поиска"; comboFind.Focus(); return; } string textReplace; try { textReplace = ParseSmartString(comboReplace.Text); } catch (WrongSmartStringException ex) { statusStrip1.Items[0].Text = ex.Message + " для замены"; comboReplace.Focus(); return; } // // Проверка на корректность строки для поиска // int n; // // Обработка первого символа в строке для поиска // if (textFind[0] == '*') { arrPart.Add(""); n = 1; } else { n = 0; } // // Обработка остальных символов в строке для поиска // Создание массива из частей того, что надо искать // string part = ""; while (n < textFind.Length) { if (textFind[n] == '*' && textFind[n - 1] != '\\') { arrPart.Add(part); part = ""; } else { if (textFind[n] != '\\') { part += textFind[n]; } else { if (n + 1 < textFind.Length && textFind[n + 1] == '*') { part += "*"; n++; } else { part += "\\"; } /*else * { * statusStrip1.Items[0].Text = "Ошибка в записи строки для поиска"; * comboFind.Focus(); * return; * }*/ } } n++; } arrPart.Add(part); var parts = new string[arrPart.Count]; arrPart.CopyTo(parts); /*string q = ""; * for(int i = 0; i < parts.Length; i++) { * * q += parts[i] + "\r\n"; * } * MessageBox.Show(q); * return;*/ // // Если в строке для поиска нет * (или только * и ничего больше) // if (parts.Length == 1) { if (parts[0] == "") { statusStrip1.Items[0].Text = "Произведено замен: 1"; m_MainForm.textWindow.Text = textReplace; m_MainForm.textWindow.SelectionStart = 0; } else { // // Подсчёт количества будущих замен // string text = m_MainForm.textWindow.Text; int num = text.IndexOf(textFind); while (num != -1) { cntRepl++; num = text.IndexOf(textFind, num + textFind.Length); } // // Собственно, замена // textBuilder.Replace(textFind, textReplace); } } else { // // Если строка для поиска содержит * - то ищутся по порядку все возможных части // строки для поиска (между *) // int num1 = 0; if (parts[0] != "") { num1 = (textBuilder.ToString()).IndexOf(parts[0], 0); } while (num1 != -1 && num1 < textBuilder.Length) { int num2 = num1 + parts[0].Length; for (int i = 1; i < parts.Length; i++) { if (parts[i] != "") { num2 = (textBuilder.ToString()).IndexOf(parts[i], num2) + parts[i].Length; if (num2 == parts[i].Length - 1) { goto quit; } } else { num2 = textBuilder.Length; break; } } textBuilder.Remove(num1, num2 - num1); textBuilder.Insert(num1, textReplace); cntRepl++; statusStrip1.Items[0].Text = "Произведено замен: " + cntRepl; Application.DoEvents(); num1 += textReplace.Length; if (parts[0] != "") { num1 = (textBuilder.ToString()).IndexOf(parts[0], num1); } } } } else { // // Замена без использования рег. выражений // Подсчёт количества будущих замен // string text = m_MainForm.textWindow.Text; int num = text.IndexOf(comboFind.Text); while (num != -1) { cntRepl++; num = text.IndexOf(comboFind.Text, num + comboFind.Text.Length); } // // Собственно, замена // textBuilder.Replace(comboFind.Text, comboReplace.Text); } quit: statusStrip1.Items[0].Text = "Произведено замен: " + cntRepl; m_MainForm.textWindow.Text = textBuilder.ToString(); m_MainForm.textWindow.SelectionStart = 0; }
/// <summary> /// Найти дальше /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonFindNext_Click(object sender, EventArgs e) { if (comboFind.Text == "") { comboFind.Focus(); return; } bool callRepeat = false; _appStart = false; if (comboFind.Items.Count == 0 || comboFind.Text != comboFind.Items[0].ToString()) { _actClass.AddValue("findVals", comboFind.Text); LoadComboBoxList(comboFind, "findVals"); if (comboFind.Items.Count > 0) { comboFind.Text = comboFind.Items[0].ToString(); } } if (comboReplace.Visible && (comboReplace.Items.Count == 0 || comboReplace.Text != comboReplace.Items[0].ToString())) { _actClass.AddValue("replaceVals", comboReplace.Text); LoadComboBoxList(comboReplace, "replaceVals"); if (comboReplace.Items.Count > 0) { comboReplace.Text = comboReplace.Items[0].ToString(); } } _appStart = true; statusStrip1.Items[0].Text = ""; int start = _mainForm.textWindow.SelectionStart; int len = _mainForm.textWindow.SelectionLength; repeat: int sel = FindNext(comboFind.Text, start, len); if (sel > -1) { if (!CheckWord(sel)) { start = sel; len = comboFind.Text.Length; goto repeat; } _mainForm.textWindow.SelectionStart = sel; _mainForm.textWindow.SelectionLength = comboFind.Text.Length; _mainForm.textWindow.ScrollToCaret(); _mainForm.ShowPosition(); } else { if (checkBoxFindUp.Checked) { statusStrip1.Items[0].Text = "Достигнуто начало документа. Поиск продолжен с конца"; sel = FindNext(comboFind.Text, _mainForm.textWindow.Text.Length, 0); } else { statusStrip1.Items[0].Text = "Достигнут конец документа. Поиск продолжен с начала"; sel = FindNext(comboFind.Text, 0, 0); } if (sel > -1 && !callRepeat) { if (!CheckWord(sel)) { callRepeat = true; start = sel; len = comboFind.Text.Length; goto repeat; } _mainForm.textWindow.SelectionStart = sel; _mainForm.textWindow.SelectionLength = comboFind.Text.Length; _mainForm.textWindow.ScrollToCaret(); _mainForm.ShowPosition(); } else { statusStrip1.Items[0].Text = "Строка не найдена"; } } }