0
votes

JS Expression régulière Ajoutez quelque chose avant le support

J'ai la chaîne suivante: xxx pré>

J'essaie d'ajouter heyAAA code> avant le support de fermeture, par exemple .. p>

.pipe(replace('^(\@something\s*{(?:\n.*)*?\n)}', 'heyaaa'))


0 commentaires

3 Réponses :


1
votes

Le problème est dans le deuxième paramètre de la fonction remplacer code> Fonction: Votre code remplace ce qui correspond à heyAAA code> au lieu d'insérer heyaaa code> à l'endroit que vous avez veux.

Vous pouvez simplement faire ce qui suit, faisant référence à 1 $ code> (premier groupe correspondé em>) dans le deuxième paramètre ( remplacement em>):

p>

const input = `@something {
  color: red;
  background: yellow;
}

@otherthing {
  color: red;
  background: yellow;
}
`

const regex = /^(\@[^\s]+\s*{(?:\n.*)*?\n)}/gm

const result = input.replace(regex, '$1  NEW TEXT TO BE INSERTED\n}') // Fixed substitution

console.log(result) // Fixed result


4 commentaires

J'ai essayé mais le nouveau code remplace la chaîne entière @something {...} avec 1 $ nouveau texte à insérer} Je n'ai pas de const. . Je cherche un fichier CSS complet de gulp.src ('style.css')


Ok, à droite. La regex devrait être appliquée à style.css par gulp , ne devrait-il pas? J'ai utilisé const entré = "..." afin de fournir une solution de siple de montrer un exemple de fonctionnement, mais la même approche peut être appliquée à votre cas "véritable vie" ... Qu'en est-il de la modification .pipe (remplacer ('^ (\ @ @ @ \ S * {(?: \ n.) *? \ n)}', 'heyaaa')) dans .Pipe ( Remplacez ('^ (\ @ @ quelque chose \ s * {(?: \ n. *) *? \ n)}', '$ 1 heaaaa \ n}')) ?


Vous devez utiliser: 2 $ au lieu de 1 $, c'est le deuxième groupe capturé, vous voulez garder.


@Pietromartinelli Il semble fonctionner dans votre exemple avec le const, mais dans le style actuel.CSS, il suffit de tout remplace avec nouveau texte à insérer



0
votes

Un moyen est de tout capturer avant dernier } code> dans un groupe et dans la fonction de rappel de remplacer Utilisez ce groupe capturé avec la valeur que vous souhaitez.

p>

let str = `@something {
  color: red;
  background: yellow;
}`

let op = str.replace(/^(@something\s*[\w\W]+)}$/g,function(_,g1){
  return g1 + '  heyya,\n}'
})

console.log(op)


0 commentaires

1
votes

Vous capturez la pièce dès le début jusqu'au dernier point-virgule d'un groupe et après cela, vous correspondez à la corde bouclée de fermeture. Mais pour récupérer cela dans le remplacement, vous devez vous référer au groupe de capture. Ce que vous avez assorti ne sera pas là car vous remplacez ce que vous avez assorti.

Pour corriger votre regex, vous pouvez capturer le dernier } code> dans un groupe ^ (@ @ @ @ @ @ @ @ @ * {(?: \ n. *) *? \ n) (}) code> et dans le remplacement, reportez-vous à ces groupes. p>

p>

const regex = /^(@[^{]+{\s*(?:(?!\n})(\s+).*\n)*)(})/gm;
const str = `@something {
  color: red;
  background: yellow;
}`;
const subst = `$1$2heyaaa\n$3`;
const result = str.replace(regex, subst);
console.log(result);


5 commentaires

Merci pour l'explication! Dans votre exemple, cela fonctionne, mais pour moi, il remplace l'ensemble du @something {...} avec heyaa . Dans mon code, je recherche une feuille de style à partir de gulp.src ('style.css') , n'utilise pas un const str


@Cyberjunkie Avez-vous essayé .pipe (remplacer (^ (@ [^ {] + {\ s * (?: (?! \ n}) (\}) (}) ',' $ 1 $ $ 2HeyAAA \ N $ 3 ')) ? Ou bien essayez la fonction de rappel: .pipe (remplacer (/ ^ (^ (^ (^ {] + {\ s * (?: (?! \ N}). * \ N) *) ( }) /, fonction (_, g1, g2, g3) {retour g1 + g2 + "heyaaa \ n" + g3;}))


J'ai essayé .pipe (remplacer (^ (@ [^ {] + {\ s * (?: (?! \ N}) (\ s +). * \ N) *) "," $ 1 $ 2HeyAAA \ N $ 3 ')) Mais cela ne change rien. Peut-être que je dois à la place de rechercher le premier support de fermeture } dans le CSS et remplacez-le .. @something sera toujours le premier élément de mon CSS


Avez-vous essayé aussi le rappel?


@Cyberjunkie content que cela a fonctionné pour vous. J'ai ajouté le code avec le rappel à ma réponse.