1
votes

Regex correspond à tout ce qui se trouve entre & foo = jusqu'à ce qu'il réapparaisse

J'utilise JavaScript et j'ai besoin d'une expression regex pour faire correspondre tout ce qui se trouve entre "foo".

Quand j'utilise la chaîne suivante.

((&foo=)(.*))*

Elle devrait renvoyer

match1: test1
match2: test2
match3: test3%20test4

J'ai essayé l'expression suivante

&foo=test1&foo=test2&foo=test3%20test4

mais malheureusement, elle a renvoyé toute la chaîne.

Comment puis-je améliorer mon expression regex?


1 commentaires

S'il n'y a pas de qs autre que foo alors foo = ([^ &] +) suffit.


3 Réponses :


2
votes

Cette expression n'utilise pas . * , mais il peut être prudent d'ajouter une liste de caractères entre foo = et le & code suivant >, peut-être similaire à:

foo=([A-Z-a-z0-9%]+)&?

Ensuite, en utilisant des groupes de capture, vous pouvez capturer tout ce que vous voulez.

Vous pouvez tester / modifier / changer / pratiquer vos expressions dans ce lien , si vous le souhaitez.

 entrez la description de l'image here

Graphique descriptif RegEx

Ceci link vous aide à visualiser vos expressions:

 entrez la description de l'image ici p >

  • Vous pouvez ajouter des limites supplémentaires à vos expressions, si nécessaire.
  • Vous pouvez également développer votre liste de caractères.

Test JavaScript

const regex = /foo=([A-z0-9%]+)&?/gm;
const str = `&foo=test1&foo=test2&foo=test3%20test4&foo=test1&foo=test2&foo=test3%20test4&foo=test1&foo=test2&foo=test3%20test4`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Edit

Sur la base des conseils de toto , il est préférable de changez Az en A-Za-z ou vous pouvez utiliser az avec l'indicateur i , sur la base des conseils de Limbo, puisque Az transmet également d'autres caractères tels que [ et .

foo=([A-z0-9%]+)&?


2 commentaires

[A-z] correspond à plus de lettres, voir un tableau ASCII.


... ou utilisez l'indicateur i



2
votes

Cela fonctionne, enregistrez le groupe de capture 1 dans un tableau.

&foo=([\S\s *?)(?=&foo=|$)

https://regex101.com/r/I5JiIc/1


0 commentaires

4
votes

Au lieu d'utiliser des expressions régulières, je suggère d'utiliser la classe intégrée URLSearchParams :

const params = new URLSearchParams('&foo=test1&foo=test2&foo=test3%20test4');

params.getAll('foo');
// ["test1", "test2", "test3 test4"]

Fonctionne dans tous les principaux navigateurs. (Nécessite un polyfill pour IE 11, si cela vous intéresse.)


0 commentaires