4 votes

Groupes de capture multiples dans MATLAB

J'ai une chaîne de caractères qui contient soit un chiffre, soit une lettre. a , éventuellement suivie de r ou l .

Dans MATLAB, l'expression rationnelle suivante renvoie la valeur suivante

>> regexp('10r', '([0-9]*|a)(l|r)*', 'match')
ans = 
    '10r'

Je m'attends à ce que 10 et r séparément, car j'ai deux groupes de capture. Existe-t-il un moyen d'obtenir un tableau de cellules avec les deux groupes renvoyés indépendamment ? Je ne le vois pas dans la documentation.

7voto

Peter Points 6459

Vous voulez "tokens" au lieu de "match

>> toks = regexp('10r', '([0-9]*|a)(l|r)*', 'tokens');
>> toks{1}
ans = 
    '10'    'r'

Ou si vous voulez faire preuve de fantaisie, nommez les jetons et obtenez un tableau structuré :

>> toks = regexp('10r', '(?<number>[0-9]*|a)(?<letter>l|r)*', 'names');
>> toks
toks = 
    number: '10'
    letter: 'r'

1voto

The fourth bird Points 40138

Si vous voulez faire correspondre

comporte soit un chiffre, soit la lettre a, éventuellement suivie de r ou l en tant que * signifie 0 fois ou plus.

Vous pouvez également utiliser [0-9]+ pour faire correspondre au moins un chiffre et utiliser une classe de caractères pour faire correspondre r ou l.

([0-9]+|a)([lr]?)

Le modèle correspond :

  • ([0-9]+|a) Capture groupe 1 , correspondre à 1+ chiffres 0-9 ou correspondre à a
  • ([lr])? Capture groupe 2 et, éventuellement, correspondre à l'un ou l'autre des éléments suivants l ou r

Démonstration des expressions rationnelles

Pour éviter les correspondances partielles, vous pouvez également utiliser des frontières entre les mots :

\<([0-9]+|a)([lr]?)\>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X