2017-07-17 1 views
1

Disons que nous avons une collection de fichiers dont les noms peuvent être myfilename_ABC (type 1) ou myfilename_ABC=XYZ (type 2). À condition que nous fournissions regexp à un moment donné avec un tableau de noms de fichiers d'un seul de ces deux types, comment l'obtenir pour retourner un tableau avec 1 (pour le type 1) ou 2 (pour le type 2) contenant les 3 -Les combinaisons de lettres? Je l'ai essayé d'utiliserJetons de regexp Matlab - jetons optionnels et taille du tableau retourné

'myfilename_(\w+)=?(\w+)?'

mais retourne une matrice de cellules avec 2 colonnes, même pour les noms de fichiers de type 1, où la deuxième colonne contient une chaîne vide ''.

+0

Le nombre de groupes est défini dans le modèle, vous pouvez uniquement utiliser un post-traitement pour se débarrasser des colonnes indésirables. –

+0

Vous pouvez [diviser] (https://www.mathworks.com/help/matlab/ref/regexp.html#btqcpjk-4) avec '' myfilename_ | = ''et ignorer le premier résultat (vide). – Steve

Répondre

1

Il est possible de le faire si vous créez simplement des expressions de correspondance pour chaque cas et utilisez un conditional operator. Par exemple:

>> type1 = {'myfilename_ABC'; 'myfilename_DEF'}; 
>> type2 = {'myfilename_ABC=XYZ'; 'myfilename_DEF=UVW'}; 
>> matchExpr = 'myfilename_(\w+)=(\w+)|myfilename_(\w+)'; 
>> results1 = regexp(type1, matchExpr, 'tokens', 'once') 

results1 = 

    2×1 cell array 

    {1×1 cell} % Each cell contains 1-by-1 results 
    {1×1 cell} 

>> results2 = regexp(type2, matchExpr, 'tokens', 'once') 

results2 = 

    2×1 cell array 

    {1×2 cell} % Each cell contains 1-by-2 results 
    {1×2 cell} 

Notez que je posai la plus expression de correspondance (myfilename_(\w+)=(\w+)) avant une plus courte (myfilename_(\w+)) afin qu'il tenterait de faire correspondre le plus premier. J'ai également utilisé le 'once' option (pour faire correspondre l'expression une seule fois par entrée) à remove an extra layer of cell encapsulation.