2009-07-28 8 views
0

J'ai une entrée comme leregex pour chercher chaîne entre [a] et [/ a] l'exclusion de toute autre balise comme [b] [/ b] qui vient entre

suivant
[a href=http://twitter.com/suddentwilight][font][b][i]@suddentwilight[/font][/a] My POV: Rakhi Sawant hits below the belt & does anything for attention... [a href=http://twitter.com/mallikaLA][b]http://www.test.com[/b][/a] has maintained the grace/decency :) 

Maintenant, je dois obtenir la chaîne @suddentwilight et http://www.test.com qui vient à l'intérieur des étiquettes d'ancrage. il peut y avoir des balises [b] ou [i] qui enveloppent le texte. Je dois ignorer ça.

Fondamentalement, j'ai besoin d'obtenir une chaîne de correspondance qui commence par [a] puis besoin d'obtenir la chaîne/URL avant la fermeture de l'étiquette [/a].

S'il vous plaît Proposer

+0

Pourquoi le downvote? –

Répondre

3

Je ne sais pas C#, mais voici un regex:

/\[a\s+[^\]]*\](?:\[[^\]]+\])*(.*?)(?:\[[^\]]+\])*\[\/a\]/ 

Cela correspond [a ...][tag1][tag2][...][tagN]text[/tagN]...[tag2][tag1][/a] et capturer text.

Pour expliquer:

  • le /.../ sont délimiteurs regex communs (comme des guillemets pour les chaînes). C# peut simplement utiliser des chaînes pour initialiser des regex - auquel cas les barres obliques ne sont pas nécessaires.
  • \[ et \] correspondent à un caractère littéral [ et ]. Nous devons leur échapper avec un backslash puisque les crochets ont une signification spéciale dans les regex.
  • [^\]] est un exemple d'une classe de caractères - ce qui signifie ici tout caractère qui n'est pas un crochet fermé. Les crochets délimitent la classe de caractères, le signe d'insertion (^) indique la négation, et le crochet carré fermé échappé est le caractère annulé.
  • * et + sont des suffixes signifiant match 0 ou plus et 1 ou plus du modèle précédent, respectivement. Donc [^\]]* signifie 0 ou plus de n'importe quoi sauf un crochet fermé.
  • \s est un raccourci pour la classe de caractères des caractères blancs
  • (?:...) vous permet de regrouper le contenu dans un modèle atomique.
  • (...) fait, mais enregistre également la sous-chaîne que cette partie de l'expression rationnelle correspond à une variable. Ceci est normalement appelé capture, car il capture cette partie de la chaîne pour que vous puissiez l'utiliser plus tard. Ici, nous utilisons une capture pour saisir le texte de lien.
  • . correspond à un seul caractère.
  • *? est un suffixe pour la correspondance non gourmande. Normalement, le suffixe * est gourmand et correspond autant qu'il le peut tout en permettant au reste du motif de correspondre à quelque chose. *? est le contraire - il correspond aussi peu que possible tout en permettant au reste du motif de correspondre à quelque chose. La raison pour laquelle nous utilisons *? ici au lieu de * est que si nous avons plusieurs [/a] s sur une ligne, nous n'allons que jusqu'à la suivante lorsque le texte du lien correspondant.

Ce ne supprimerons [tag] s qui viennent au début et à la fin du texte, pour éliminer tous ceux qui entrent dans le milieu du texte (comme [a href=""]a [b]big[/b] frog[/a]), vous aurez besoin de faire un second passage sur la capturer à partir du premier, récurant tout texte qui correspond:

/\[[^\]]+\]/ 
+0

Non cette expression de dosent semble fonctionner pour moi :(Elle retourne une chaîne vide en sortie – Tanmoy

+0

Avec quelle méthode utilisez-vous la regex? Une qui exige que l'expression rationnelle corresponde à la chaîne entière, ou à une expression qui requiert uniquement l'expression regex correspondre à une sous-chaîne C# est à la fois – rampion

+0

j'utilise:. var = sortie Regex.Match (entrée, modèle); – Tanmoy

Questions connexes