Соответствие строк по количеству слов с регулярным выражением - PullRequest
0 голосов
/ 31 августа 2010

Я все еще новичок в регулярных выражениях и столкнулся с небольшой проблемой. Я создаю сценарий синтаксического анализа, и мне нужно, чтобы иметь возможность извлечь строки из определенной длины из файла.

Как бы я написал регулярное выражение для сопоставления строк, которые содержат определенное количество слов? Например, я хочу сопоставить все строки в файле, содержащем 3 слова.

Могу ли я расширить это, чтобы найти все строки в определенных параметрах? Например, я хочу сопоставить все строки в файле, содержащие от 2 до 5 слов.

Я использую Perl на случай, если это имеет значение. Спасибо!

Ответы [ 4 ]

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

Это зависит от того, что вы считаете словом. Perl 5 считает слово /\w+/. Если у вас есть другое определение, вам нужно будет его предоставить.

Вы можете узнать количество совпадений регулярных выражений с помощью оператора Подсчет секрета : ()=:

my $count = ()= $line =~ /\w+/g;

Как только вы знаете количество слов, вы можете легко создать оператор if для печати строки, если число или слова находятся между двумя числами, используя >= и <= операторы .

В Perl 5.10 и более поздних версиях можно сопоставить от двух до пяти слов с помощью собственнического квантификатора :

#!/usr/bin/perl

use strict;
use warnings;

while (my $line = <DATA>) {
    next unless $line =~ /^(?:\W*+\w++){2,5}$/;
    print $line;
}

__DATA__
one
one two
one two three
one two three four
one two three four five
one two three four five six
0 голосов
/ 01 сентября 2010

Вот способ ПОЦЕЛУЙ.

while(<>){
  #assumption: words separated by spaces
  @s = split /\s+/ ;
  # now check the length of @s and do if/else
}
0 голосов
/ 31 августа 2010

Замените 3 на количество слов, которое вы ищете. Это регулярное выражение предполагает отсутствие пробелов или табуляции в начале строки:

^ (? = (\ Ъ [A-Za-z0-9.] + \ Ъ [\ х20]) {3}) (.) *

Это говорит о совпадении: с начала каждой строки просмотрите каждую строку, чтобы найти 3 буквенно-цифровых или периодических слова, каждое из которых заканчивается одним пробелом и если то, что мы смотрели вперед на совпадения, тогда выделите всю строку независимо от того, что на ней

Примечание: \ x20 соответствует пробелу, а регулярное выражение было разработано в notepad ++ памятью и рукой.

0 голосов
/ 31 августа 2010

(ответ Часа был не совсем верным - он пропустил флаг оператора m//.):)

use strict;
use warnings;

use Data::Dumper;

my @good;
foreach my $line (<DATA>)
{
    chomp $line;
    my $matches =()= ($line =~ /\b\w+\b/g);
    print "(debugging) found matches $matches\n";
    push @good, $line if $matches >= 2 and $matches <= 5;
}

print "matching lines: ", Dumper(\@good);

__DATA__
foo bar baz bap
foo bar baz
blah blah blah foooo

bip

производит:

(debugging) found matches 4
(debugging) found matches 3
(debugging) found matches 4
(debugging) found matches 0
(debugging) found matches 1
matching lines: $VAR1 = [
          '    foo bar baz bap',
          '    foo bar baz',
          '    blah blah blah foooo'
        ];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...