Regex: поиск n-го совпадения - PullRequest
       0

Regex: поиск n-го совпадения

1 голос
/ 26 августа 2010

Я пытаюсь написать регулярное выражение, соответствующее n-му совпадению. Поскольку я новичок в регулярных выражениях, пожалуйста, помогите мне в решение этого.

Введите:

DECLARE numerator NUMBER; BEGIN SELECT x, y INTO numerator, denominator FROM result_table, secondTable WHERE sample_id = 8; delete from xyz where id=17;

Соответствует первому ГДЕ или соответствует второму ГДЕ.

Также, пожалуйста, предложите мне хорошую ссылку на:

  1. Жадный и не жадный подход.
  2. Вложенное регулярное выражение.

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 26 августа 2010

Вы не указали язык.Я предполагаю, что вы используете какую-то форму динамического языка сценариев (Perl, C #, Ruby, Python и т. Д.), Где понятия регулярных выражений очень похожи.Я покажу вам, как это сделать на Perl, и любой язык, который вы используете, должен быть похожим.

С Perl вы можете выполнить глобальное сопоставление шаблона регулярного выражения и вернуть список для работы.С помощью этого списка вы можете обратиться к n-му совпадению, используя смещения массива в возвращаемом списке.

Рассмотрим:

#!/usr/bin/perl

use strict; use warnings;

# use a block of text; in this case "Grimms' Tales from Gutenburg
GetGrimmFairyTail() unless -e '2591.txt';

my (@m1,@m2);
my $i=1;
open (my $grimms,'<','2591.txt') or die $!;
undef $/; #'slurp' mode
my $tail=<$grimms>;

# How many 'cats' in Grimms' Tails?
my $regex=qr/(^.*?\bcat\b.*$)/mi;

@m1=($tail=~(/$regex/g)); 
print   "\n",
        scalar @m1, " global matches\n";

print   "first match is:\n$m1[0]\n",
        "second is:\n$m1[1]\n",
        "last is:\n$m1[-1]\n", 
        "second to last is:\n$m1[-2]\n\n\n";

#How many dogs?
$regex=qr/(^.*?\bdog\b.*$)/mi;      
foreach my $line (split (/\n/,$tail))  {
     while ($line=~/$regex/g) {
        push @m2, [ "Line $i", $1 ];
     }   
     $i++;
 }      

print scalar @m2, " foreach loop matches\n";        
print   "first match with line number:\n$m2[0][0]: $m2[0][1]\n",
        "second is:\n$m2[1][0]: $m2[1][1]\n",
        "last is:\n$m2[-1][0]: $m2[-1][1]\n", 
        "second to last is:\n$m2[-2][0]: $m2[-2][1]\n\n";       

print "The end!\n\n";

sub GetGrimmFairyTail {
    use Net::ftp;
    use File::Spec;
    print   "\n",
            "Getting \"Grimms' Fairy Tales\" from ", 
            "University of North Carolina, Chapel Hill....\n\n";
    my $host='ibiblio.org';
    my $lf;
    my $ftp=Net::FTP->new($host,DEBUG=>0) 
        or die "Cannot connect to $host: $@";
    $ftp->login("anonymous",'-anonymous@')
          or die "Cannot login ", $ftp->message;  
    my $fn=$lf=$ftp->get("/pub/docs/books/gutenberg/2/5/9/2591/2591.txt")
          or die "get failed ", $ftp->message;    
    my $size= -s $fn;
    my $abspath=File::Spec->rel2abs($fn);
    open (my $fh, '<', $fn) or die "can't open downloaded file: $!";
    my $line_count=0;
    my $rs=$/;
    $line_count++ while <$fh>;
    $/=$rs;
    print   "Success!\n",
            "$size bytes containing $line_count lines downloaded into file:\n",
            "$abspath\n\n" if -e $abspath;
    $ftp->quit;
}

Возврат:

87 global matches
first match is:
     CAT AND MOUSE IN PARTNERSHIP
second is:
     THE FOX AND THE CAT
last is:
king got to the bottom, he ordered Cat-skin to be called once more, and
second to last is:
Cat-skin,' said the cook; 'for you always put something into your soup,


41 foreach loop matches
first match with line number:
Line 57:      THE DOG AND THE SPARROW
second is:
Line 665: After he had travelled a little way, he spied a dog lying by the
last is:
Line 9078: crevice of the tree, and the little fellow was jumping about like a dog
second to last is:
Line 8561: pursue it; but hardly had the dog run two steps when it stood before a

The end!
1 голос
/ 26 августа 2010

Относительно вашего второго вопроса, т.е. хороших ссылок для регулярных выражений: -

http://www.regular -expressions.info /

см .: Обучение обычномуВыражения ,

вы получите хорошие предложения относительно книг, ссылок, инструментов для регулярных выражений и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...