Вопрос

Строковая переменная 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\">")

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top