Ceci est un exemple d'une chaîne.
<div>other text</div> some text abc , <div>need_match_this</div> bbbb <p>hsa</p> aa <span>hello</span>
Je ne connais que la fin de la ficelle "<span>hello</span>"
et j'ai besoin de faire correspondre le texte dans le div le plus proche
J'ai utilisé cette regex:
<div>(.*?)</div>.*?<span>hello</span>
Mais cela ne fonctionne pas pour moi car je dois renvoyer le texte de la division la plus proche uniquement, pas la première division de la chaîne.
Existe-t-il une solution regex pour résoudre ce problème?
S'il vous plaît aider.
Je vous remercie
Réponses:
5 pour la réponse № 1Vous devez utiliser une expression rationnelle basée sur le lookahead négatif plutôt qu'entre .*?
, depuis .*?
correspondrait également à l'ouverture ou à la fermeture div
Mots clés.
<div>((?:(?!</?div>).)*?)</div>(?:(?!</?div>).)*?<span>hello</span>
(?:(?!</?div>).)*?
oblige le moteur de regex à correspondre à n'importe quel caractère mais pas de <div>
ou </div>
. C'est-à-dire qu'avant de faire correspondre chaque caractère, cette expression rationnelle vérifiera si ce caractère particulier n'est pas le caractère de départ dans <div>
ou </div>
. Si oui, alors cela correspondrait à ce personnage. Si non, la correspondance échouera brusquement et le personnage suivant ne sera pas identifié.
Exemple:
chaîne - <div></div>
regex - <div>((?:(?!</?div>).)*?)</div>
Pour cette entrée, la regex mentionnée ci-dessus capturerait la chaîne vide entre-deux (c'est-à-dire que la chaîne vide existe entre l'ouverture et la fermeture div
Mots clés). (?!</?div>).
dans ce qui précède serait vérifier le caractère suivant ne doit pas être un caractère de départ dans <div>
ou </div>
mais cela échoue car le caractère suivant est <
qui est un personnage fixe dans </div>
. Parce que nous avons défini cette expression rationnelle particulière pour répéter zéro ou plusieurs fois, (?:(?!</?div>).)*?
, il capture la chaîne vide entre les deux.