Résultat inattendu de la chaîne .NET IndexOf
Question
Une variable chaîne str contient les éléments suivants quelque part: se\">
J'essaie de trouver le début en utilisant:
str.IndexOf("se\\\">")
qui renvoie -1
Pourquoi ne trouve-t-il pas la sous-chaîne?
Remarque: en raison de l'édition de l'extrait de code qui a montré 5x \ pendant un certain temps, l'original en avait 3 de suite.
La solution
Votre code recherche en fait 'se\\">'
. Lors de la recherche de chaînes comprenant des barres obliques inverses, il est généralement plus facile d’utiliser des chaînes complètes:
str.IndexOf(@"se\"">")
Dans ce cas, vous avez également une citation dans la chaîne de recherche. Il reste donc des échappements, mais je trouve personnellement qu'il est plus facile à lire.
Mettre à jour : ma réponse était basée sur la modification qui introduisait des barres obliques supplémentaires dans le paramètre de l'appel IndexOf
. Sur la base de la version actuelle, je parierais sur str
ne contenant simplement pas la séquence de caractères attendue.
Mise à jour 2 : D'après les commentaires sur cette réponse, il semble y avoir une certaine confusion en ce qui concerne le rôle du caractère '\' dans les chaînes. Lorsque vous inspectez une chaîne dans le débogueur Visual Studio, celle-ci sera affichée avec des caractères d'échappement.
Ainsi, si vous avez une zone de texte dans laquelle vous tapez "c: \", l'inspection de la propriété Text dans le débogueur affichera "c: \\". Une barre oblique inverse supplémentaire est ajoutée à des fins d'évasion. Le contenu réel de la chaîne est toujours 'c: \' (ce qui peut être vérifié en vérifiant la propriété Length
de la chaîne; ce sera 3, pas 4).
Si nous prenons la chaîne suivante (extraite du commentaire ci-dessous)
" '< em class = \ " correct_response \ " > a Veilleuse < / em > < br / > < br / > < table width = \ & "100% \ &"; > < tr > < td class = \ & "right \ &"; > Ingrid &; lt; / td > < / tr > < / table > ') "
... les \"
séquences sont simplement des guillemets échappés; les barres obliques inverses ne font pas partie du contenu de la chaîne. Donc, vous recherchez en fait 'se">'
et non 'se\">'
. L'un ou l'autre fonctionnera:
str.IndexOf(@"se"">"); // verbatim string; escape quotation mark by doubling it
str.IndexOf("se\">"); // regular string; escape quotation mark using backslash
Autres conseils
Ceci fonctionne:
string str = "<case\\\">";
int i = str.IndexOf("se\\\">"); // i = 3
Peut-être n'échappez-vous pas correctement à l'une des deux chaînes?
EDIT il y a un couple supplémentaire de \
dans la chaîne que vous recherchez.
Peut-être que la variable str ne contient pas réellement la barre oblique inverse. Il se peut simplement que lorsque vous passez la souris sur la variable pendant le débogage, l'info-bulle du débogueur affiche le caractère d'échappement.
par exemple. Si vous mettez un point d'arrêt après cette affectation
string str = "123\"456";
l'info-bulle indiquera 123 \ & "; 456 et non 123 &"; 456.
Toutefois, si vous cliquez sur l'icône de visualisation, vous obtiendrez la chaîne correcte 123 & 456
Code suivant:
public static void RunSnippet()
{
string s = File.ReadAllText (@"D:\txt.txt");
Console.WriteLine (s);
int i = s.IndexOf("se\\\">");
Console.WriteLine (i);
}
Donne la sortie suivante:
some text before se\"> some text after
17
On dirait que je travaille pour moi ...
TextBox2.Text = TextBox1.Text.IndexOf("se\"">")
semble fonctionner en VB.
Les cotes DoubleQuotes d'une chaîne doivent être spécifiées comme ""
Vous pouvez également envisager d'utiliser des chaînes in extenso - un exemple serait
var source = @"abdefghise\"">jklmon";
Console.WriteLine(source.IndexOf(@"se\"">")); // returns 8
Si vous recherchez se \ & "; >
puis
str.IndexOf(@"se\"">")
est moins sujet aux erreurs. Notez le double & Quot; & Quot; et unique \
Modifier, après le commentaire: il semble que la chaîne puisse contenir du texte lui-même, auquel cas, dans se \ & "; > \ & "" est une citation échappée. Le texte littéral est donc simplement se & "; > et la chaîne à utiliser est Indexof("se\">")