Domanda

Una variabile stringa str contiene al suo interno qualcosa di simile: se\">

Sto cercando di trovarne l'inizio usando:

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

che restituisce -1

Perché non trova la sottostringa?

Nota: a causa della modifica dello snippet mostrato 5x \ per un po ', l'originale aveva 3 di fila.

È stato utile?

Soluzione

Il tuo codice sta infatti cercando 'se\\">'. Quando cerco stringhe comprese barre rovesciate di solito trovo più facile usare stringhe testuali:

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

In questo caso hai anche una citazione nella stringa di ricerca, quindi c'è ancora qualche evasione, ma personalmente trovo che sia più facile da leggere.

Aggiorna : la mia risposta si basava sulla modifica che ha introdotto ulteriori barre nel parametro alla chiamata IndexOf. In base alla versione corrente, piazzerei la mia scommessa su str semplicemente non contenente la sequenza di caratteri prevista.

Aggiornamento 2 : Sulla base dei commenti su questa risposta, sembra esserci una certa confusione riguardo al ruolo del carattere "\" nelle stringhe. Quando si controlla una stringa nel debugger di Visual Studio, questa verrà visualizzata con caratteri di escape.

Quindi, se hai una casella di testo e digita 'c: \', ispezionando la proprietà Text nel debugger mostrerai 'c: \\'. Una barra rovesciata aggiuntiva viene aggiunta per motivi di fuga. Il contenuto della stringa effettiva è ancora 'c: \' (che può essere verificato controllando la proprietà Length della stringa; sarà 3, non 4).

Se prendiamo la seguente stringa (presa dal commento qui sotto)

  &

quot; &' Lt; em   class = \ quot &; correct_response \ quot &; > un   luce notturna < / em > < br   / > < br / > < tabella   & Width = \ quot; 100% \ quot &; Gt &; Lt &; Tr gt &; & Lt; td   & Class = \ quot; destra \ quot &; & Gt; & Ingrid lt; / td gt &; Lt &; / Tr gt &; & Lt; & / table gt; ') quot &;

... le sequenze \" sono semplicemente virgolette sfuggite; le barre rovesciate non fanno parte del contenuto della stringa. Quindi, stai effettivamente cercando 'se">', non 'se\">'. Ognuno di questi funzionerà:

str.IndexOf(@"se"">");  // verbatim string; escape quotation mark by doubling it
str.IndexOf("se\">");   // regular string; escape quotation mark using backslash

Altri suggerimenti

Funziona:

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

Forse non stai sfuggendo correttamente a una delle due stringhe?

EDIT c'è un paio extra di \ nella stringa che stai cercando.

Forse la variabile str non contiene effettivamente la barra rovesciata. Può darsi che quando passi il mouse sulla variabile durante il debug, la descrizione del debugger mostrerà il carattere di escape.

es. Se metti un punto di interruzione dopo questo incarico

string str = "123\"456";

la descrizione comando mostrerà 123 \ " 456 e non 123 " 456.

Tuttavia, se fai clic sull'icona di visualizzazione, otterrai la stringa corretta 123 " 456

Codice seguente:

public static void RunSnippet()
{
    string s = File.ReadAllText (@"D:\txt.txt");
    Console.WriteLine (s);
    int i = s.IndexOf("se\\\">");
    Console.WriteLine (i);
}

Fornisce il seguente output:

some text before se\"> some text after
17

Sembra lavorare con me ...

TextBox2.Text = TextBox1.Text.IndexOf("se\"">")

sembra funzionare in VB.

DoubleQuotes all'interno di una stringa deve essere specificato come "" Considera anche l'uso di stringhe testuali - Quindi un esempio potrebbe essere

var source = @"abdefghise\"">jklmon";
Console.WriteLine(source.IndexOf(@"se\"">"));  // returns 8

Se stai cercando se\">

quindi

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

è meno soggetto a errori. Nota la doppia & Quot; & Quot; e singolo \

Modifica, dopo il commento: sembra che la stringa possa contenere l'ecaping stesso, nel qual caso in se \ " > il \ " era una citazione con escape, quindi il testo letterale è semplicemente se " > e la stringa da usare è Indexof("se\">")

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top