Строка .NET IndexOf неожиданный результат
Вопрос
Строковая переменная str где-то внутри содержит следующее: se\">
Я пытаюсь найти его начало, используя:
str.IndexOf("se\\\">")
который возвращает -1
Почему он не находит подстроку?
Примечание:из-за редактирования фрагмент какое-то время показывал 5x\, в оригинале было 3 подряд.
Решение
Ваш код на самом деле ищет 'se\\">'
.При поиске строк, содержащих обратную косую черту, мне обычно проще использовать дословные строки:
str.IndexOf(@"se\"">")
В этом случае в строке поиска также есть кавычка, поэтому экранирование все равно есть, но лично мне так легче читать.
Обновлять:мой ответ был основан на редактировании, которое ввело дополнительные косые черты в параметре IndexOf
вызов.Учитывая текущую версию, я бы сделал ставку на str
просто не содержит ожидаемой последовательности символов.
Обновление 2:Судя по комментариям к этому ответу, возникает некоторая путаница относительно роли символа '\' в строках.Когда вы проверяете строку в отладчике Visual Studio, она будет отображаться с экранирующими символами.
Итак, если у вас есть текстовое поле и вы вводите в него «c:\», проверка свойства Text в отладчике покажет «c:\\».Для экранирования добавляется дополнительная обратная косая черта.Фактическое содержимое строки по-прежнему равно 'c:\' (что можно проверить, проверив Length
свойство строки;будет 3, а не 4).
Если мы возьмем следующую строку (взятую из комментария ниже)
" u003Cemn class="correct_response">Ночной светu003C/em>u003Cbrn />u003Cbr />u003Ctablen width="100%">u003Ctr>u003Ctdn class="right"> Ингридu003C/td>u003C/tr>u003C/table> ') "
... \"
последовательности представляют собой просто экранированные кавычки;обратные косые черты не являются частью содержимого строки.Итак, вы действительно ищете 'se">'
, нет 'se\">'
.Любой из них будет работать:
str.IndexOf(@"se"">"); // verbatim string; escape quotation mark by doubling it
str.IndexOf("se\">"); // regular string; escape quotation mark using backslash
Другие советы
Это работает:
string str = "<case\\\">";
int i = str.IndexOf("se\\\">"); // i = 3
Может быть, вы не правильно экранировали одну из двух строк?
РЕДАКТИРОВАТЬ есть дополнительная пара \
в строке, которую вы ищете.
Возможно, переменная str на самом деле не содержит обратной косой черты.Возможно, когда вы наводите указатель мыши на переменную во время отладки, во всплывающей подсказке отладчика отображается escape-символ.
напримерЕсли вы поставите точку останова после этого присваивания
string str = "123\"456";
во всплывающей подсказке будет показано 123"456, а не 123"456.
Однако если вы нажмете на значок визуализации, вы получите правильную строку 123"456.
Следующий код:
public static void RunSnippet()
{
string s = File.ReadAllText (@"D:\txt.txt");
Console.WriteLine (s);
int i = s.IndexOf("se\\\">");
Console.WriteLine (i);
}
Дает следующий вывод:
some text before se\"> some text after
17
Похоже на работу со мной ...
TextBox2.Text = TextBox1.Text.IndexOf("se\"">")
, похоже, работает в VB.
DoubleQuotes в строке необходимо указывать как ""
Также рассмотрите возможность использования дословных строк - так что пример будет
var source = @"abdefghise\"">jklmon";
Console.WriteLine(source.IndexOf(@"se\"">")); // returns 8
Если вы ищете se \ " >
тогда
str.IndexOf(@"se\"">")
менее подвержен ошибкам. Обратите внимание на двойные & Quot; & Quot; и одиночный \
Отредактируйте после комментария: кажется, что строка может содержать сам себя, в этом случае в se \ " > в \ " был экранированной кавычкой, поэтому буквальный текст просто se " > и используемая строка - Indexof("se\">")