2011-11-07 4 views
3

Qu'est-ce que je fais mal ici?erreur quantificateur invalide javascript sur regex

J'essaie de remplacer un nombre dans une chaîne par un autre nombre en utilisant javascript. J'ai une longue chaîne qui a le numéro 1 plusieurs fois. Je dois remplacer le numéro 1 par 2 dans tous les cas, sauf si 1 a un autre numéro de chaque côté. J'ai fait un tas de recherches google pour savoir comment utiliser regex (je suis totalement nouveau sur regex) et j'ai trouvé ça.

string.replace(/(?<!\d)1(?!\d)/,2); 

Fondamentalement, je veux l'expression rationnelle match (et donc remplacer) toutes les occurrences du numéro 1 où il est entouré de tout sauf un autre numéro. Je ne veux pas que la correspondance inclue les caractères environnants - seul le chiffre 1.

Je continue d'obtenir l'erreur de quantificateur non valide dans ma console firebug. Qu'est-ce que je fais mal?

Répondre

7

C'est ce bit: (?<!\d). Il n'y a pas de (?<, seulement (?:, (?= et (?!.

JavaScript ne pas regarder en arrière, mais je pense que vous pouvez travailler autour d'elle dans ce cas, comme celui-ci:

str = str.replace(/(^|\D)1(?!\d)/g, "$12") 

qui capture le caractère immédiatement avant le chiffre, puis échos en arrière ($1 dans la chaîne de remplacement) suivi du nouveau contenu (2). Le ^ près du début permet au chiffre étant le premier caractère dans la chaîne.

Live example

Décomposant:

(^|\D) Match either start-of-string, or a non-digit, and capture the result 
1  Match the digit 1... 
(?!\d) ...but only if it isn't followed by a digit

Et dans le remplacement, $12 est pas "remplacer par groupe de capture 12" (qui est ce qu'il ressemble à moi), mais " remplacer par le groupe de capture 1 suivi du chiffre 2. "

+0

Le colon est-il l'opérateur correct pour le lookbehind négatif? Je lisais [link] http://www.regular-expressions.info/lookaround.html sur comment faire des lookbehinds négatifs et il dit d'utiliser le caractère lt. Je l'ai remplacé par le deux-points comme vous l'avez dit et je ne reçois plus l'erreur, mais il ne renvoie pas de correspondance non plus? J'ai essayé d'ajouter g après la barre oblique finale pour correspondre à chaque occurrence et cela ne fonctionne toujours pas. Je suis désemparé ici. – codescribblr

+0

@Jonathan: Non, JavaScript n'a pas de look-behind (seulement anticipé, à la fois positif et négatif). Le '?:' Indique simplement un bloc non-capturant. –

+0

Bonne explication! Merci beaucoup. Voici ce que je me suis retrouvé sur la base de ce que vous m'avez donné: 'var i = 1; \t $ ("# addshipmentobjecbutton") { \t \t cliquez sur (function() if (i <= 5) { \t \t \t var old_object = $ ('# shipmentobject') html();.. \t \t \t var new_object = ancien_objet.replace (/ (^ | \ D) \ d (?! \ d)/g, "$" + i + 2); \t \t \t $ ('# shipmentobjects').ajouter ("

" + nouvel_objet + "
"); \t \t \t i ++; \t \t} \t}); ' – codescribblr

Questions connexes