2010-12-01 9 views
4

Je suis en train d'utiliser l'expression régulière dans mon script Perl pour analyser un fichier pour correspondre:Expression régulière pour la correspondance n et de l'espace

Espace et « \ n » (saut de ligne) de manière alternée - -à-dire d'abord je voudrais qu'il corresponde à l'espace, puis un « \ n », puis un espace (qui est sur une nouvelle ligne dans le fichier ... et ainsi de suite)

grâce, -AD

+0

Sérieusement? Vous avez essayé d'afficher une question sur l'expression régulière dans le "Wild Wild West" de Q and A? 8o0 Wow ... Je suis un peu surpris que vous n'ayez pas obtenu de réponses à propos de vous dire de le faire sur un mac/linux/pc ... oui, je sais que perl fonctionne sur tous et il est indépendant de la plateforme; c'est un peu mon point; 0)))) – Keng

+2

C'est un problème d'analyse bizarre. Pouvez-vous décrire les étapes dont vous pensez avoir besoin, mais le plus gros problème que vous essayez de résoudre? –

Répondre

1

Essayez ceci:

(^ \n)+ 
0

pour correspondre à la Début d'une ligne, utilisez le signe ^.

Pour correspondre à l'espace, vous pouvez utiliser un espace littéral, ou pour tout espace, utilisez \s.

En mettant sgm à la fin du motif, par ex. /pattern/sgm va le faire correspondre à travers les lignes.

Vous trouverez plus d'informations et quelques exemples au perldoc perlfaq6 si vous êtes intéressé.

2

Vous pouvez faire:

if($file =~/ |(?: \n)+ ?/) { 
     print $file." has the pattern\n"; 
} 

Le regex utilisé est |(?: \n)+ ? qui correspond:

  • espace ou
  • Un ou plusieurs space\n suivi par un en option space
0

Vous avez dit que vous vouliez que le deuxième espace de votre motif soit sur la nouvelle ligne. Maintenant, si vous serez en mesure d'obtenir cela dépend de l'endroit où vous avez obtenu votre chaîne de (bien, peut-être pas , mais je suppose que vous obtenez mon point). Si les données que vous analysez sont lues à partir d'un fichier, vous devez lire le fichier en mode paragraphe (c'est-à-dire que chaque paragraphe au lieu de chaque ligne constituera un enregistrement).

En supposant que vous utilisez le fichier handle fichier, procédez comme suit:

{ 
    local $/ = ""; # one paragraph constitutes one record 
    while (<FILE>) { 
     if (/ \n /) { 
     print "Found one match!\n"; 
     } 
    } 
} 

S'il vous plaît noter que le modèle de regex je l'ai utilisé ne prend pas en compte plusieurs occurrences de l'espace-newline-espace, comme je n » étais pas Je suis sûr de ce que vous essayiez de faire exactement. Mais de toute façon, mon point principal est l'utilisation de

local $/ = ""; 

HTH