2014-11-13 3 views
0

Зайдите в Блокнот. Введите «Это тест, это тест, это тест». Поместите каретку в самый конец текста. Перейдите в Edit -> Find -> Type «is» -> Настройте направление на «Up».Как искать запрошенный текст назад?

Каждый тип, нажимая «Найти следующий», «есть» до каретки. Затем, затем в следующий раз, набрав «Find Is», выбирается предыдущее «is».

Как это сделать в коде аналогичным образом, используя текстовое поле WinForm? Я не понимаю, как искать назад для определенных строк. Благодарю.

ответ

2

String.LastIndexOf(string value, int startIndex) способ.

Этот метод начинает поиск в позиции символа startIndex строки и продолжается назад в направлении начала, пока не будет найдено ни value, ни первая позиция символа.

0

Поскольку вы, по-видимому, используете фактическое поле поиска, этот код может вам помочь. Он предназначен для полного эмуляции параметров поиска «Блокнот», включая текущую позицию курсора, чувствительность к случаю (в) и поиск вперед/назад. Он будет автоматически закрываться до начала файла, а затем искать текст перед курсором (и наоборот для обратного поиска).

protected Int32 DoSearch(ref String sourceText, String findText, Int32 searchStartPos, StringComparison sc, Boolean forward) 
    { 
     Int32 resultPos = -1; 
     if (forward) 
     { 
      // Makes sure that if the cursor is currently ON a result, then the next result is found. 
      // Not needed for backwards search, since you search before the current position in that case. 
      if (sourceText.Length - findText.Length >= searchStartPos && findText.Equals(sourceText.Substring(searchStartPos, findText.Length), sc)) 
       searchStartPos++; 

      resultPos = sourceText.IndexOf(findText, searchStartPos, sc); 
      if (resultPos == -1) 
       resultPos = sourceText.IndexOf(findText, 0, searchStartPos, sc); 
     } 
     else 
     { 
      resultPos = sourceText.LastIndexOf(findText, searchStartPos, sc); 
      if (resultPos == -1) 
      { 
       Int32 start = sourceText.Length; 
       Int32 length = start - searchStartPos; 
       resultPos = sourceText.LastIndexOf(findText, start, length, sc); 
      } 
     } 
     return resultPos; 
    } 

Обратите внимание, что sourceText обрабатывается по ссылке только потому, что обычная переменная строка будет скопирована на вызов функции, которая является тратой времени здесь; текст может быть довольно большим, и эта функция никогда не изменяет строку, поэтому просто передача указателя мне кажется более эффективной.

(В моем полном коде это оптимизировано в остальной части моего кода окна поиска, с событием TextChanged оценки, имел ли текст, который будет повторно извлекается из текстового поля)

Этого поиск то, как правило, с последующим кодом, выбирая соответствующий фрагмент, используя возвращенный resultPos в качестве начала выбора и findText.Length в качестве длины выбора.

Смежные вопросы