2009-11-03 7 views
5

que je veux faire correspondre toutes les lignes qui ont des caractères majuscules en eux, mais en ignorant la chaîne A_Regexp correspondance des caractères majuscules, sauf une chaîne particulière

Pour ajouter à la complication que je veux ignorer tout après une autre chaîne , par exemple un commentaire open

Voici des exemples de ce qui devrait et shouldnt rencontres

Correspondances:

  • fooBar
  • foo Bar foo
  • A_fooBar
  • fooBar/* Commentaire */

non Matches (C_ ne devrait pas déclencher un match)

  • A_foobar
  • foo A_bar
  • foobar
  • foo bar foo bar
  • foobar/* Commentaire */

merci :)

+0

quelle langue? – jitter

+0

A_fooBar a un A_ et il est listé dans les matchs, je ne comprends pas (d'autant qu'A_foobar est listé comme n'étant pas un match). –

+0

Je fais ce test en utilisant powergrep. @ C. Ross, A_fooBar est un match à cause du B dans la barre, pas à cause de l'A_ – Alan

Répondre

3

Cela devrait (aussi?) Faire:

(?!A_)[A-Z](?!((?!/\*).)*\*/) 

Une brève explication:

(?!A_)[A-Z]  # if no 'A_' can be seen, match any uppercase letter 
(?!    # start negative look ahead 
    ((?!/\*).) # if no '/*' can be seen, match any character (except line breaks) 
    *    # match zero or more of the previous match 
    \*/   # match '*/' 
)    # end negative look ahead 

Ainsi, en clair E nglish:

Correspond à toute majuscule sauf 'A_' et aussi pas une majuscule si '* /' peut être vu sans rencontrer d'abord '/ *'.

1

Essayez:

(?<!A_)[a-zA-Z]+ 

(?!...) est appelé negative lookbehind.

En ce qui concerne votre problème, il est une sorte de tricherie, mais essayez:

^([#\.]|(?<!A_))[A-Za-z]{2,} 

je reçois:

fooBar => fooBar 
foo Bar foo => foo 
A_fooBar (no match) 
fooBar /* Comment */ => fooBar 
A_foobar (no match) 
foo A_bar => foo 
foobar => foobar 
foo bar foo bar => foo 
foobar /* Comment */ => foobar 
+0

merci, mais je ne veux pas correspondre [a-zA-Z]. C'est ce que j'ai jusqu'ici^([AZ] | [#.]) [^ {] *? (? <= [AZ]) maintenant je dois exclure toutes les correspondances qui ont A_ comme leurs seuls caractères majuscules – Alan

+0

il correspond CSS incase vous vous demandez – Alan

+0

Cette expression n'a pas beaucoup de sens. Je cours un petit test et il ne correspond qu'à ceux avec A à l'avant. – cletus

0

Celui-ci le fait, bien que la manipulation de commentaires ne sont pas extrêmement robuste. (Il suppose qu'un commentaire est toujours à la fin de la ligne.)

.*((A(?!_)|([B-Z]))(?<!/\*.*)).*\r\n 
+0

Cela semble très prometteur Mike, merci. Je pense que sa chute quand il y a plusieurs _, toujours en regardant dans – Alan

0

-t-il être un seul regex? En Perl, vous pouvez faire quelque chose comme:

if (! $ String = ~/[AZ]/& & $ string ~/A_ /)

Son pas aussi cool comme une seule expression avec lookback, mais c'est probablement plus facile à lire et à maintenir.

+0

merci SDGator, je ne pense pas que j'ai la capacité de le faire – Alan

1

Ma réponse:

/([B-Z]|A[^_]|A$)/ 

Je supprimerait le commentaire à un stade précoce, si possible.

Test:

#!perl 
use warnings; 
use strict; 

my @matches = (
"fooBar", 
"foo Bar foo", 
"A_fooBar", 
"fooBar /* Comment */"); 

my @nomatches = (
"A_foobar", 
"foo A_bar", 
"foobar", 
"foo bar foo bar", 
"foobar /* Comment */"); 

my $regex = qr/([B-Z]|A[^_]|A$)/; 

for my $m (@matches) { 
    $m =~ s:/\*.*$::; 
    die "FAIL $m" unless $m =~ $regex; 
} 
for my $m (@nomatches) { 
    $m =~ s:/\*.*$::; 
    die "FAIL $m" unless $m !~ $regex; 
} 

Essayez-le: http://codepad.org/EJhWtqkP

+0

merci Kinopiko, aime la simplicité de votre solution. J'écris des expressions à utiliser dans l'analyse de code statique, donc je ne vais pas enlever quoi que ce soit. C'est pourquoi je ne veux pas faire une correspondance dans un commentaire. – Alan

+0

Copiez simplement la chaîne et faites une correspondance avec la chaîne copiée. –

0

Essayez ceci:

^(?:[^A-Z/]|A_|/(?!\*))*+[A-Z] 

Cela fonctionne dans toute la saveur qui prend en charge quantificateurs possessifs, par exemple PowerGrep, Java et PHP. La saveur de .NET ne est pas, mais il ne supporte des groupes atomiques:

^(?>(?:[^A-Z/]|A_|/(?!\*))*)[A-Z] 

Si aucune de ces fonctionnalités est disponible, vous pouvez utiliser un autre test avant pour l'empêcher correspondant à la A_ sur le rebond:

^(?:[^A-Z/]|A_|/(?!\*))*(?!A_)[A-Z] 
Questions connexes