Как исключить субматчи в Perl? - PullRequest
1 голос
/ 13 мая 2011

Мне нужно разбить строку на части, содержащие слова или специальные символы.

Допустим, у меня есть строка «Это« другая проблема ... »». То, что я хочу получить, это массив, состоящий из следующих частей: ('This', 'is', '"', 'another', 'problem', '...', '"').

Я сделал это в JavaScript со следующим RegExp, который отлично работает:

string.match(/([^-\s\w])\1*|[-\w]+/g); // works

Использование того же подхода в Perl не работает из-за подшаблона, который я использую для объединения последовательных символов, и я также получаю следующие совпадения:

@matches = $string =~ m/(([^-\s\w])\2*|[-\w]+)/g; # does not work

Есть ли способ избавиться от подшаблонов / подсовпадений либо в результате, либо в самом регулярном выражении?

Ответы [ 3 ]

5 голосов
/ 13 мая 2011

В вашем примере "не работает", я думаю, вы имеете в виду \ 2, а не \ 1.

Чтобы сделать это, вам придется пройтись по матчам:

push @matches, "$1" while $string =~ m/(([^-\s\w])\2*|[-\w]+)/g;
1 голос
/ 13 мая 2011
my @matches;
push @matches, ${^MATCH} while $string =~ /([^-\s\w])\1*|[-\w]+/pg;

my @matches;
push @matches, $1 while $string =~ /(([^-\s\w])\2*|[-\w]+)/g;

my $i = 1;
my @matches = grep ++$i % 2, $string =~ /(([^-\s\w])\2*|[-\w]+)/g;
0 голосов
/ 13 мая 2011

В Perl есть несколько способов сделать это (TMTOWTDI):

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my $str='Here\'s a (good, bad, ..., ?) example to be used in this "reg-ex" test.';

# NB: grepping on $_ will remove empty results

my @matches = grep { $_ } split(/
  \s*             # discard possible leading whitespace
  (
    \.{3}         # ellipsis (must come before punct)
  |
    \w+\-\w+      # hyphenated words
  |
    \w+\'(?:\w+)? # compound words
  | 
    \w+           # other words
  | 
    [[:punct:]]   # other punctuation chars
  )
/x,$str);

print Dumper(\@matches);

напечатает:

$VAR1 = [
      'Here\'s',
      'a',
      '(',
      'good',
      ',',
      'bad',
      ',',
      '...',
      ',',
      '?',
      ')',
      'example',
      'to',
      'be',
      'used',
      'in',
      'this',
      '"',
      'reg-ex',
      '"',
      'test',
      '.'
    ];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...