2 votes

Expression régulière un groupe capturé avec 1 à 5 ords

J'ai une phrase comme "C'est [[un groupe capturé]]". Le nombre de mots entre les groupes capturés peut être de 1 à 5.

Je veux sélectionner tout ce qui se trouve entre les deux parenthèses (y compris les parenthèses). Je sais que je pourrais utiliser quelque chose comme @"^.*(?<identifier>\[\[\.*\]\]).*$" mais je veux essayer d'être plus précis alors j'ai pensé que ça pourrait marcher : @"^.*(?<identifier>\[\[\w*(\b\w*){0,4}\]\]).*$"

Quelqu'un peut-il voir pourquoi cela ne fonctionne pas ? Il capture s'il y a un mot entre les crochets mais pas plusieurs. Je pensais que le (\b\w*){0,4} permettrait d'ajouter de 0 à 4 mots.

Merci, Bill N

3voto

Alex Points 19487

Je pense que vous oubliez les délimiteurs de mots ( \s ):

^.*(?<identifier>\[\[\w+(\s+\b\w+){0,4}\]\]).*$

2voto

Aliostad Points 47792

Votre problème est ici :

(\b\w*){0,4}

Cela ne fonctionnerait pas car vous n'avez pas prévu de espaces . Changez-le en :

(\s+\b\w*){0,4}

Ceci capturera les espaces mais vous pouvez facilement post-traiter (en utilisant Trim() ).

0voto

stema Points 36113

Vous créez plusieurs groupes capturés, un par tranche. Essayez ceci :

@"^.*(?<identifier>\[\[\w*(?:\s\w*){0,4}\]\]).*$"

(?:) Il s'agit d'un groupe non capturant, qui ne crée pas de variable, de sorte que votre résultat est toujours dans le groupe nommé.

Mise à jour : Et bien sûr, comme les deux autres réponses l'ont souligné, votre principal problème est le manque de \s J'ai également ajouté ceci à ma solution.

Mise à jour2 : Le site \b n'est pas nécessaire lorsque le \s est ajouté, donc retiré.

0voto

Ma préférence irait à quelque chose comme ceci (non testé) :

^[^\[]*(?<identifier>\[\[\s*(\w+(?:\s+|(?=\]))){1,5}\]\])[\S\s]*$

^                           # begin of string
 [^\[]*                      # some optional not '[' chars
 (?<identifier>              # <ID> begin
    \[\[                        # '[['
         \s*                             # some optional whitespace
         (?:\w+ (?:\s+|(?=\])) ){1,5}    # 1-5 words separated by spaces
    \]\]                        # ']]'
 )                           # end <ID>
 [\S\s]*                     # some optional any chars
$ 
                     # end of string

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