9
votes

Ne remplacez pas Regex si elle est enfermée par un personnage

Je voudrais remplacer toutes les chaînes qui sont entourées par - dans des chaînes jointes par ~ , mais pas si cette chaîne est à nouveau enfermée par * .

À titre d'exemple, cette chaîne ... xxx

... devrait devenir ... xxx

Nous voyons - est seulement remplacé s'il est pas dans * * .

My JavaScript -regex pour l'instant (qui ne se soucie pas de savoir s'il est enfermé par * ou non): xxx

modifier: Notez qu'il pourrait être le cas qu'il y a un nombre impair de * s.


5 commentaires

Pourquoi le bowvote?


Yup je suis étonné, une si bonne question.


Quoi quand il y a un nombre impair de * caractères? Par exemple. Le * -Quick- * Brown * -F-OX * saute *. quel - Les caractères doivent être remplacés et pourquoi?


@Maras Le dernier * n'est pas remplacé. Il est imprimé comme *


Firefox's's Y drapeau, DIT être proposé pour ECMAScript 6 aiderait beaucoup: développeur.mozilla.org/en-us/docs/javascript/ Référence / ...


4 Réponses :


2
votes

C'est un type de chose délicat à faire avec des expressions régulières. Je pense que ce que je ferais, c'est quelque chose comme ceci: xxx

Jsfiddle Demo

qui recherche - ou * groupes et effectue uniquement le remplacement sur des ennets. En général, les syntaxes "nidification" sont difficiles (ou impossibles) avec des expressions régulières. (Et bien sûr, comme un commentaire sur les notes de questions, il y a des cas particuliers - des métacaractères suspendus - qui compliquent cela aussi.)


7 commentaires

Exemple de travail: jsfiddle.net/zb6bu - Je ne sais pas pourquoi cela ne se lève pas, cela fonctionne juste comme prévu! +1


@Bergi je vois que maintenant, + 1 pour tous :) haha


@Pointy: Le groupe est vraiment inutile, il correspond à ce que contient le premier argument ... et vous ne devez pas utiliser la notation de support sur les chaînes.


@Bergi oui c'est probablement vrai; C'est juste une habitude. Je ne sais pas ce que tu veux dire sur la notation du support. Oh, tu veux dire au lieu de .chardat () ? Y a-t-il des navigateurs modernes qui ne font pas ça?


@Bergi C'est dans la spécification :-)


Pourriez-vous s'il vous plaît expliquer comment cela ressemblerait si vous remplacez tout : d , mais pas si ils sont entre - S?


@poitroae - Hmm, c'est un problème quelque peu différent; Je devrais y penser. Vous voudrez peut-être poser une question distincte.



1
votes

Je le résoudrais en divisant la matrice basée sur * , puis remplacant uniquement les indices paires. La correspondance des étoiles déséquilibrées est plus délicate, il consiste à savoir si l'index du dernier élément est impair ou même: xxx

démo


5 commentaires

Et si la chaîne contient un * qui ne fait pas partie d'une paire? par exemple. 'Le -Quick- * Brown-Box saute.' Si je comprends correctement, dans ce cas, -Quick - et -f - devrait être remplacé, mais seul le -Quick - sera.


@Kenb, il suppose que les étoiles sont bien équilibrées :)


Selon le contexte, c'est une très grande hypothèse.


Vous n'aurez pas besoin de rejoindre le résultat de la carte ?


@Kenb qui devrait être réparé maintenant :)



1
votes

Découvrez si une correspondance est pas clôturée par certains délimiteurs est une tâche très compliquée - voir aussi Cette Exemple . Cherchant pourrait aider, mais JS ne prend en charge que regarder Lookahead. Nous pourrions donc réécrire " pas entouré de ~ " to " suivi d'un numéro un ou ~ ", et Correspond à ce que: xxx

mais mieux nous correspondons à la fois sur - et * , afin que nous consommons tout ce qui est enveloppé dans * s aussi et peut alors décider d'une fonction de rappel de ne pas le remplacer: xxx

Ceci a l'avantage de pouvoir mieux préciser " ", par exemple En ajoutant des limites de mots sur le "intérieur", pour une meilleure gestion de modèles non valides (nombre impair de * caractères mentionnés par @maras par exemple) - la regex actuelle prend juste les deux autres apparitions suivantes.


0 commentaires

0
votes

une version ererser de la réponse très claire de Jack. XXX

semble fonctionner, Bravo.


0 commentaires