Essayer de construire une expression régulière pour récupérer/sélectionner des éléments dans une chaîne encodée en fonction de l'ordre des signes du clavier :

 str = "(abc-1é,d[efg_2ç;i|jkl+3ö.(mno?4à,p[qr(st!5',uv#6^;|xyz%7_." // look strange :)

Je dois récupérer toutes les pièces incluses

1) dans ( , -> "abc-1é" + "mno?4à" + "st!5'"

2) dans [ ; -> "efg_2ç" + "qr(st!5,uv#6^"

3) dans | . -> "jkl+3ö" + "xyz%7_"

J'ai essayé beaucoup de possibilités sur https://regex101.com/ et je suis capable d'en produire bons résultats :

/\(([^()]*),/g -> catch "(abc-1é," "(mno?4à," and "(st!5'," -> OK

/\|[\w()]{0,}(...)./g -> catch "|jkl+3ö."  and  "|xyz%7_." -> OK

Ne me demandez pas pourquoi mais ça marche, sauf :

/\[([^()]*);/g  or /\[[\w()]{0,}(...);/g  -> catch "[efg_2ç;" but ignore "[qr(st!5',uv#6^;"

Ma question est : est-il possible de créer une regex unique capable de capturer les 3 signes-conditions ? quelque chose comme:

 / init: \[|\(|\| -> inside: [all founded signs, any length] -> end: ,|.|; /g

Et (si possible) avec quelques explications... Merci d'avance

0
Wolden 16 juin 2020 à 14:46

1 réponse

Meilleure réponse

Cette puissante regex unique, capable de tout faire correspondre à la fois, n'existe pas en raison des interférences de modèles rivaux. On pourrait utiliser 3 modèles à la place, chacun étant limité exactement à son cas d'utilisation spécial.

Une approche possible utilise ensuite matchAll pour chaque motif, convertit/déstructure et collecte chaque tableau de résultats en un seul tableau et mappe enfin toutes les captures. Une telle approche est également plus lisible et meilleure pour la refactorisation/maintenance...

// (/(?:\((?<pc>[^,]*),)|(?:\[(?<bs>[^;]*);)|(?:\|(?<pp>[^\.]*)\.)/gm);

const regxParenthesesComma = (/\(([^,]*),/gm);
const regxBracketSemicolon = (/\[([^;]*);/gm);
const regxPipePeriod = (/\|([^\.]*)\./gm);

function extractCharacterSequences(str) {
  return [

    ...str.matchAll(regxParenthesesComma),
    ...str.matchAll(regxBracketSemicolon),
    ...str.matchAll(regxPipePeriod)

  ].map(result => result[1]);
}

const test = "(abc-1é,d[efg_2ç;i|jkl+3ö.(mno?4à,p[qr(st!5',uv#6^;|xyz%7_.";

console.log(
  'extractCharacterSequences(test) => ',
  extractCharacterSequences(test)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
1
Peter Seliger 16 juin 2020 à 13:57