corda .NET IndexOf resultado inesperado
Pergunta
A cadeia variável str contém o seguinte em algum lugar dentro dele: se\">
Eu estou tentando encontrar o começo dele usando:
str.IndexOf("se\\\">")
que retorna -1
Por que não é encontrar a substring?
Nota:., Devido à edição do trecho mostrou 5x \ por um tempo, o original tinha 3 em uma linha
Solução
Seu código é de fato procurando 'se\\">'
. Ao procurar por seqüências incluindo barras invertidas Eu costumo achar que é mais fácil de usar cordas textualmente:
str.IndexOf(@"se\"">")
Neste caso, você também tem uma citação na seqüência de pesquisa, por isso ainda há alguns escapar, mas eu pessoalmente encontrá-lo mais fácil de ler.
Atualizar : a minha resposta foi baseado na edição que introduziu cortes extras no parâmetro para a chamada IndexOf
. Com base na versão atual, eu colocaria a minha aposta str
simplesmente não contendo a sequência de caracteres esperado.
Update 2 : Com base nos comentários sobre esta resposta, parece haver alguma confusão sobre o papel do '\' caractere nas cordas. Quando você inspecionar uma corda no depurador Visual Studio, ele será exibido com escapar caracteres.
Então, se você tem uma caixa de texto e digite 'c: \' nele, inspecionando a propriedade Text no depurador irá mostrar 'c: \\'. Uma barra extra é adicionado para fins de escapar. O conteúdo seqüência real ainda é 'c: \'. (Que pode ser verificado, verificando a propriedade Length
da corda, que será 3, não 4)
Se tomarmos o seguinte string (retirado do comentário abaixo)
" ' a luz da noite
') "
Ingrid
... as seqüências \"
são simplesmente escapou aspas; as barras invertidas não são parte do conteúdo da string. Então, você está na verdade procurando 'se">'
, não 'se\">'
. Qualquer um destes trabalhos vontade:
str.IndexOf(@"se"">"); // verbatim string; escape quotation mark by doubling it
str.IndexOf("se\">"); // regular string; escape quotation mark using backslash
Outras dicas
Isso funciona:
string str = "<case\\\">";
int i = str.IndexOf("se\\\">"); // i = 3
Talvez você não está corretamente escapar uma das duas cordas?
Editar , há um par extra de \
na corda que você está procurando.
Talvez a variável str não contém realmente a barra invertida. Pode ser apenas que quando você passa o mouse sobre a variável durante a depuração, a dica de ferramenta depurador irá mostrar o caractere de escape.
por exemplo. Se você colocar um ponto de interrupção após esta atribuição
string str = "123\"456";
a dica irá mostrar 123 \ "456 e não 123" 456.
No entanto, se você clicar no ícone visualize, você vai obter a seqüência correta 123" 456
o seguinte código:
public static void RunSnippet()
{
string s = File.ReadAllText (@"D:\txt.txt");
Console.WriteLine (s);
int i = s.IndexOf("se\\\">");
Console.WriteLine (i);
}
Dá seguinte resultado:
some text before se\"> some text after
17
Parece que trabalhar para mim ...
TextBox2.Text = TextBox1.Text.IndexOf("se\"">")
parece funcionar em VB.
de aspas dentro de uma necessidade string a ser especificado como ""
Considere também usando cordas Verbatim - Então, um exemplo seria
var source = @"abdefghise\"">jklmon";
Console.WriteLine(source.IndexOf(@"se\"">")); // returns 8
Se você está à procura de se \ ">
então
str.IndexOf(@"se\"">")
é menos propenso erro de. Observe o dobro "" e único \
Editar, depois do comentário: parece que a seqüência pode conter ecaping si, caso em que, em se \ "> \" foi uma cotação escapado, então o texto literal é simplesmente se "> e a corda para uso é Indexof("se\">")