.NET строка IndexOf неожиданный результат - PullRequest
2 голосов
/ 25 июня 2009

Строковая переменная str содержит в себе следующее: se\">

Я пытаюсь найти начало, используя:

str.IndexOf("se\\\">")  

, который возвращает -1

Почему он не находит подстроку?

Примечание: из-за редактирования фрагмент некоторое время показывал 5x \, у оригинала было 3 подряд.

Ответы [ 7 ]

8 голосов
/ 25 июня 2009

Ваш код фактически ищет 'se\\">'. При поиске строк, включая обратную косую черту, обычно проще использовать дословные строки:

str.IndexOf(@"se\"">")

В этом случае у вас также есть кавычка в строке поиска, так что еще есть какой-то выход, но мне лично легче читать.

Обновление : мой ответ основывался на редактировании, в результате которого в вызове IndexOf появились дополнительные косые черты в параметре. Исходя из текущей версии, я бы сделал ставку на str, просто не содержащую ожидаемой последовательности символов.

Обновление 2 : Основываясь на комментариях к этому ответу, кажется, что существует некоторая путаница относительно роли символа «\» в строках. При проверке строки в отладчике Visual Studio она будет отображаться с экранирующими символами.

Итак, если у вас есть текстовое поле и введите «c: \», проверка свойства Text в отладчике покажет «c: \\». Добавлена ​​дополнительная обратная косая черта для экранирования. Фактическим содержимым строки по-прежнему является «c: \» (что можно проверить, проверив свойство Length строки; это будет 3, а не 4).

Если мы возьмем следующую строку (взято из комментария ниже)

"' а ночной свет

<таблица ширина = \ "100% \">

<тд класс = \ "вправо \"> Ингрид ') "

... последовательности \" - это просто экранированные кавычки; обратные косые черты не являются частью содержимого строки. Итак, вы на самом деле ищете 'se">', а не 'se\">'. Любой из них будет работать:

str.IndexOf(@"se"">");  // verbatim string; escape quotation mark by doubling it
str.IndexOf("se\">");   // regular string; escape quotation mark using backslash
2 голосов
/ 25 июня 2009

Возможно, переменная str на самом деле не содержит обратной косой черты. Может случиться так, что при наведении указателя мыши на переменную во время отладки во всплывающей подсказке отладчика будет отображаться символ перехода

например. Если вы поставили точку останова после этого назначения

string str = "123\"456";

всплывающая подсказка покажет 123 \ 456, а не 123 \ 456.

Однако, если вы нажмете на значок визуализации, вы получите правильную строку 123 "456

2 голосов
/ 25 июня 2009

Это работает:

string str = "<case\\\">";
int i = str.IndexOf("se\\\">"); // i = 3

Может быть, вы не правильно экранировали одну из двух строк?

РЕДАКТИРОВАТЬ есть дополнительная пара \ в строке, которую вы ищете.

1 голос
/ 25 июня 2009

DoubleQuotes в строке необходимо указывать как "" Также рассмотрите возможность использования дословных строк - так что пример будет

var source = @"abdefghise\"">jklmon";
Console.WriteLine(source.IndexOf(@"se\"">"));  // returns 8
1 голос
/ 25 июня 2009

Если вы ищете se \ ">

тогда

str.IndexOf(@"se\"">") 

менее подвержен ошибкам. Обратите внимание на двойной "" и одиночный \

Правка после комментария: похоже, что строка может содержать само собой, в этом случае в se \ "> \" была экранированная кавычка, поэтому текст просто se "> и используемая строка: Indexof("se\">")

1 голос
/ 25 июня 2009
TextBox2.Text = TextBox1.Text.IndexOf("se\"">")

, кажется, работает в VB.

1 голос
/ 25 июня 2009

следующий код:

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

Похоже на работу со мной ...

...