7
votes

Expression régulière, sélectionne une partie du texte à l'intérieur d'autres

Je suis un peu désemparé de la tâche suivante. Je souhaite sélectionner un texte entre "que c'est à l'intérieur d'une balise mais pas à l'extérieur de la balise, c'est-à-dire une sélection à l'intérieur d'une autre sélection.

J'ai la balise suivante: <| et |> et je veux sélectionner un texte uniquement si c'est entre le "et entre les balises.

<| bla bla bla " doit être sélectionné " non sélectionné " sélectionnez-le trop " "|>" non sélectionné "

Je pense que quelque chose à propos de xxx

mais cela ne fonctionne pas.


5 commentaires

@nicael Avez-vous même lu la question? OP veut sélectionner des valeurs entre les guillemets uniquement si ses balises intérieures <| |>


Oui, ce n'est pas un dupliqué, je ne veux pas sélectionner de texte à l'intérieur "", je souhaite sélectionner un texte à l'intérieur "" et <| |> et sa JS et C #


@ Kkazemakhgary Peu importe, solution facilement réglable. Vous imaginez que <| et |> sont des citations et améliorent la regex.


@nicael Vous souhaitez-vous élaborer la solution facile?


@nicael je ne pense pas que son facile ajustable. Si c'est facile pour vous, cela ne signifie pas facile pour tout le monde.


4 Réponses :


6
votes

Je l'ai fait correspondre correctement en utilisant deux regexes.

p>

var input = '<|a "b"|>c "d"ef<|"g"h "i"|>"j"k l';
var output=input.match(/<\|(.*?)\|>/g)
   .map(function(x){return x.match(/"(.*?)"/g)})
alert(output)


3 commentaires

Les quantifiers gourmands * vont manger la première paire de <| , |> si plusieurs sont présents: REGEX101.com/R/WI4LF2/1


@Jan HM, cela semble être le problème. Testé à l'aide de l'exemple de OP.


@Jan édité: comme réponse mentionnée JavaScript, utilisée :)



2
votes

Essayez-le avec des look-derrière-derrière et des regards: xxx

régulier Visualisation d'expression

voici un Démo en direct . < / p>


3 commentaires

@fardjad Oh, tu as raison. La réponse de Nicael échoue à votre exemple aussi. Avez-vous de meilleures suggestions?


Oui, mais pas avec une seule regex, je posterai ma solution dans une minute.


C'est étrange ... je m'attendrais à ce que cela ne correspond à ce que ce soit uniquement le "test" partie de l'exemple de FARDJAD (au lieu de faire correspondre trop souvent), car vous ne permettez qu'un seul caractère entre le | et ouverture ", et un seul caractère entre la fermeture " et | . Pythex.org semble être d'accord ... Est-ce que le bogue debuggex, un bug Pythex ou autre chose?



3
votes

Je ne peux pas penser à une expression régulière Pour correspondre à ce que vous voulez dans un seul coup mais je ne vois pas la raison pour ne pas le faire avec deux regexps:

p>

<div id="result"></div>


0 commentaires

4
votes

Cela fera le travail dans une seule regex:

(? <= <\ | [^>] * "

En plus d'un commentaire de Nicael: il pourrait être possible que la chaîne d'entrée ne soit pas étiquetée correctement. Cela aidera:

(? <= <\ | ((((?! \ |).) "[^" ] * "

Si vous devez l'utiliser avec JavaScript:

(? = ("[^"] * "[^"] *) " "] *" (? = (((?! <\ |).) * \ |>)


6 commentaires

A l'air super, mais pourquoi ne fonctionne pas là ? Sur mobile, je ne peux pas obtenir l'erreur d'être affichée.


Trouvé un problème dans votre regex: Ce ne correspond pas correctement. J'ai remplacé le premier |> avec>, cela devrait causer "non sélectionné aussi" pour correspondre, bien que ce ne soit pas.


@nicael j'ai ajouté une regex qui résout le deuxième problème. Mon regex fonctionnera avec .NET Regex. Votre échantillon de poing montre que regarder derrière les assertions ne sont pas autorisés dans JavaScript. Pardon. Qu'est-ce que c'est? Il y a une regex qui ne supporte pas de regarder derrière? J'essaie de trouver une solution qui fonctionne avec des assertions à venir.


@nicael sera (? = ("[^"] * "[^"] *) " ^ "] *" (? = ((((?! <\ | \ |).) * \ | \ |>) soit une solution possible? Il semble étrange si vous supprimez le | du premier jeton de clôture mais peut-être que ça va.


Celui-ci semble être parfait!


@nicael La regex dans ma réponse modifiée résout le problème que vous avez posté dans le deuxième commentaire.