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.

Était-ce utile?

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\">")

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top