1
votes

Comment sélectionner tous les espaces multiples sauf les deux derniers avant un caractère spécifique avec un Regex?

Voici un exemple de chaîne:

let str = `       Lorem ipsum   
             - dolor sit amet consectetur      
        - adipisicing elit. Adipisci, quam.   `;
str = str.replace(/ {2,}/g, "");
str = str.replace(/-/g, "  -");
console.log(str);

Quelle serait la regex la plus élégante pour sélectionner tous les espaces supplémentaires SAUF pour deux espaces avant le "-" pour faire une liste élégante? p >

Voici un exemple de résultat souhaité:

Lorem ipsum
  - dolor sit amet consectetur
  - adipisicing elit. Adipisci, quam.

Voici ma meilleure estimation: / {2,} (?! {2} -) / g . Malheureusement, il sélectionne également les deux espaces avant le "-".

Modifier: Je pense que je vais suivre la suite:

   Lorem ipsum   
         - dolor sit amet consectetur      
    - adipisicing elit. Adipisci, quam.     


6 commentaires

avez-vous besoin d'utiliser regex?


@depperm Pas vraiment, je cherche juste la solution la plus élégante.


comme (? <=) (?! -) ?


@brazoayeye Presque, nous avons encore un espace avant Lorem et après ipsum et consectetur :)


qu'en est-il de (? <= ^) + | + (? = \ n | $ | (?! -)) ? Je ne suis pas très sûr des crochets pour | opérateur, mais avec un testeur en ligne, cela semble fonctionner


@brazoayeye Celui-ci fonctionne parfaitement, très belle solution.


3 Réponses :


1
votes

Vous pouvez sélectionner tous les espaces ou tabulations depuis le début et la fin de la chaîne et les remplacer par une chaîne vide. Remplacez ensuite les chaînes commençant par un trait d'union par 2 espaces.

let str = `   Lorem ipsum
         - dolor sit amet consectetur
    - adipisicing elit. Adipisci, quam. `;
str = str.split("\n").map(s => s.trim()).map(x => x.replace(/^-/, "  -")).join("\n");
console.log(str);

Vous pouvez également vous une combinaison de carte et de découpage:

const regex = /^[\t ]+|[\t ]+$/mg;
const str = `   Lorem ipsum
         - dolor sit amet consectetur
    - adipisicing elit. Adipisci, quam. `;
const subst = ``;
const result = str.replace(regex, subst).replace(/^-/gm, "  -");
console.log(result);


4 commentaires

l'espace blanc après Lorem ipsum est toujours là


il y a encore des espaces à la fin de chaque ligne


@depperm Vous avez oublié de supprimer les espaces du subst Maintenant, ils sont partis.


@depperm Maintenant, ils sont en retrait. J'ai ajouté une autre option utilisant la carte et le découpage.



1
votes
(^( +)[a-zA-Z])|(( +)(( {2}-)|\n|$))

(^( +)[a-zA-Z]): This group matches the characters before Lorem Ipsum.
(( +)(( {2}-)|\n|$)) This group matches the characters before two spaces and a -, or before a newline \n, or before the end of string $.
https://regex101.com/r/i4ppG7/5

6 commentaires

qu'en est-il des autres espaces?


@depperm lorsque vous utilisez un espace simple et non \ s il ne prend pas en compte le caractère de nouvelle ligne, donc ce n'est pas un problème. Voir le lien.


Je ne faisais pas référence à la nouvelle ligne, l'OP a dit tous les espaces, dans son message il y a des espaces après Lorem Ipsum


@depperm Vous avez raison, corrigé. Il semble qu'il ne veuille pas cibler les espaces blancs entre les mots dans le texte, alors j'ai simplement ciblé ceux avant \ n . Le groupe 1 dans l'exemple regex101 doit répondre à toutes ses exigences.


modifié pour correspondre également aux caractères avant Lorem Ipsum .


Vous pouvez modifier notamment $ like (^ (+) [a-zA-Z]) | ((+) (({2} -) | \ n | $))



0
votes

Vous pouvez utiliser le groupe de capture

let str = `Lorem ipsum   
        - dolor sit amet consectetur      
  - adipisicing elit. Adipisci, quam.  `

let finalList = str.replace(/^\s*(\s{2}.*)$/gm, '$1')

console.log('original list\n',str)
console.log('New list\n',finalList)


1 commentaires

l'espace blanc après Lorem ipsum est toujours là