Comment rechercher du texte entouré par des guillemets doubles avec la RegEx?
J'ai une chaîne avec un code HTML, par exemple:
This is <strong id="c1-id-8">some</strong> <em id="c1-id-9">text</em>
J'ai besoin de dépouiller le id
attribut de chaque balise HTML, mais j'ai zéro expérience avec des expressions régulières, j'ai cherché ici et là, à partir de l'internet et j'ai écrit ce modèle: [\s]+id=\".*\"
Malheureusement il ne fonctionne pas comme je m'attends. Enfait, j'espérais que l'expression régulière attrape le id="
suivie par n'importe quel caractère répété pour n'importe quel nombre de fois et s'est terminé avec l' plus proche double quote; Pratiquement dans cet exemple, je m'attendais à attraper id="c1-id-8"
et id="c1-id-9"
.
Mais au lieu de cela, le patron me fit la sous-chaîne id="c1-id-8">some</strong> <em id="c1-id-9"
, il trouve la première occurrence de id="
et la dernière occurrence d'une double caractère de devis.
Pourriez-vous me dire quel est le problème dans mon modèle, et comment résoudre le problème, s'il vous plaît?
Merci beaucoup
OriginalL'auteur Cesco | 2011-09-25
Vous devez vous connecter pour publier un commentaire.
Le quantificateur
.*
dans votre regex est gourmand (sens qu'elle correspond autant qu'il le peut). Afin de correspondre au minimum requis, vous pouvez utiliser quelque chose comme/\s+id=\"[^\"]*\"/
. Les crochets[]
indiquer une classe de caractères. Donc, il correspondra à la tout à l'intérieur des crochets. Le carat[^]
au début de la classe de votre personnage est une négation, ce qui signifie qu'il va correspondre à tout sauf ce qui est spécifié dans les crochets.Une alternative serait de dire la
.*
quantificateur à être paresseux par.*?
qui va correspondre à aussi peu que possible.Correct. Et bravo pour sortir et faire des recherches sur votre problème avant de le poster ici, c'est toujours utile
Excellentes précisions/corrections. J'ai édité ma réponse que j'espère être plus précis
+1 Vous fixe!
OriginalL'auteur nachito
Dans
.*
l'astérisque est un gourmand quantificateur matchs et autant de caractères qu'il le peut, il ne s'arrête à la dernière"
qu'il trouve.Vous pouvez soit utiliser
".*?"
pour le rendre paresseux, ou mieux, de l'OMI), de l'utilisation"[^"]*"
de faire le match explicite:Vous pourriez encore besoin d'échapper les guillemets si vous êtes la construction de l'expression régulière dans une chaîne; sinon ce n'est pas nécessaire puisque les citations ne sont pas de caractères spéciaux dans une regex.
OriginalL'auteur Tim Pietzcker
Un analyseur syntaxique est la meilleure solution dans le cas général, mais ils prennent le temps d'écrire. Il y a des cas où l'écriture on pourrait prendre plus de temps que l'analyseur permettrait de sauver; c'est peut-être un tel moment.
Ce que vous voulez, c'est un non-gourmand match ou plus spécifiques. /[\s]+id=\".?\"/fera l'affaire, mais [\s]+id=\"[^"]\" sera plus rapide.
Noter qu'une regex qui prend en compte la possibilité de s'échappa de citations des personnages, permet des apostrophes à la place des guillemets doubles, et permet l'absence de guillemets entièrement serait beaucoup plus complexe. Vous voulez vraiment un analyseur à ce point.
OriginalL'auteur db48x
exemple avec grep: (mais le point est que l'expression)
OriginalL'auteur Kent
Si vous savez que votre
id
est toujours de 7 caractères, vous pouvez faire cela.Donc..
Exemple: http://jsfiddle.net/jasongennaro/XPMze/
Vérifier l'inspecteur de voir le
id
s supprimé.Celui qui downvoted. Je n'ai pas l'esprit de la downvote, mais pourriez-vous me dire pourquoi?
OriginalL'auteur Jason Gennaro