2009-10-14 8 views
2

comme je ne suis pas très familier avec regex, est-il possible (que ce soit difficile à faire ou non) pour extraire certains textes entre les symboles? par exemple:En utilisant des méthodes de chaîne au lieu de Regex

<meta name="description" content="THIS IS THE TEXT I WANT TO EXTRACT" /> 
+0

par exemple ??? – solairaja

+1

Je ne crois pas que ce sera difficile, mais pour toutes les implémentations non triviales, vous cherchez une quantité relativement importante de code à écrire et à maintenir. Et il est rare que vous frappiez n'importe où près de la performance d'un Regex. – Gregory

+0

RegEx est l'une de ces choses horriblement confuses qui ne devraient pas être évitées simplement à cause de sa complexité.C'est beaucoup plus efficace que n'importe quelle méthode de cordes standard (dans la plupart des cas) et il y a de fortes chances pour que ce soit un meilleur choix, même si cela dépasse l'esprit. : -! –

Répondre

2

Bien sûr, vous peut identifier le début et la fin de votre sous-chaîne souhaitée par les méthodes de chaînes telles que IndexOf, puis obtenir le Substring désiré! Dans votre exemple, vous voulez localiser (avec IndexOf) le "contents =" puis le premier suivant ", non? Et une fois que vous avez ces indices dans la chaîne, Substring fonctionnera bien. (Non affichage du code C# parce que je ne suis pas tout à fait sûr de ce qu'est exactement c'est que vous voulez, au-delà IndexOf et Substring ... -)

Si oui, alors:

int first = str.IndexOf("contents=\""); 
int last = str.IndexOf("\"", first + 10); 
return str.Substring(first + 10, last - first - 10); 

devrait plus ou moins de faire ce que vous voulez (des excuses à nouveau s'il y a un hors-par-un ou dans ces 10 s - ils sont destinés à représenter la longueur de la première sous-chaîne que vous cherchez, les ajuster un peu vers le haut ou vers le bas jusqu'à ce que vous obteniez exactement le résultat que vous voulez! -), mais c'est le concept général. Localisez le début avec un seul argument IndexOf, localisez la fin avec deux-args IndexOf, coupez la pièce désirée avec Substring ...!

+0

c'est bien, ce que je veux, c'est le texte entre les deux citations comme dans le contenu comme ceci: content = "j'ai besoin de ce texte" –

+0

Merci pour le code Alex, mais il est loin, il extrait toujours les 15 premiers ou si les caractères du début du fichier .. étrange ??? –

+0

Que voyez-vous lorsque vous ajoutez des instructions de sortie pour afficher la valeur du premier et du dernier? –

0

Bien sûr, vous pouvez le faire sans Regex. Supposons que vous voulez obtenir le texte entre < et> ...

string GetTextBetween(string content) 
{ 
    int start = content.IndexOf("<"); 
    if(start == -1) return null; // Not found. 
    int end = content.IndexOf(">"); 
    if(end == -1) return null; // end not found 
    return content.SubString(start, end - start); 
} 
1

si l'entrée est: text1/texte2/text3

The below regex will give the 2 in the group i.e, TEXT3 

^([^/]*/){2}([^/]*)/$ 


if you need the last text always, then use the below 

^.*/([^/]*)/$ 
+0

Je pense que OP recherche une solution non-regex. –

5

Puisque vous donner un exemple xml, il suffit d'utiliser un analyseur XML :

string s = (string) XElement.Parse(xml).Attribute("content"); 

xml est pas un format de texte simple et Regex ISN pas vraiment un très bon ajustement; à l'aide d'un outil approprié vous protéger contre toute une gamme de maux ... par exemple, la suivante est identique comme xml:

<meta 
    name="description" 
    content= 
     'THIS IS THE TEXT I WANT TO EXTRACT' 
/> 

Cela signifie également que lorsque les modifications des exigences, vous disposez d'un simple, tweak à faire au code, plutôt que d'essayer de décompacter une regex et de la réassembler (ce qui peut être difficile si vous accédez à un nœud non trivial). De même, xpath peut être une option; donc dans vos données le xpath:

/meta/@content 

est tout ce dont vous avez besoin.

Si vous n'avez pas .NET 3.5:

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xml); 
string s = doc.DocumentElement.GetAttribute("content"); 
+0

C'est vraiment sympa. Merci pour celui-là! =) –

Questions connexes