некоторая логика внутри регулярного выражения в Perl - PullRequest
0 голосов
/ 18 марта 2011

В предыдущий вопрос , я задал несколько подходящих шаблонов.Теперь мой вопрос:

У меня есть несколько подходящих шаблонов:

$text =~ m#finance(.*?)end#s; (1)

$text =~ m#<class>(.*?)</class>#s; (2)

$text =~ m#/data(.*?)<end>#s; (3)

$text =~ m#/begin(.*?)</begin>#s; (4)

Я хочу сначала сопоставить (1), (2) и (3).Однако после соответствия (1) или (2), если (4) появляется перед другим (1) или (2), то не совпадают (3), а только (4).Таким образом, внешний вид (4) исключает соответствие (3).Но в случае, если нет (4), (3) совпадает.Есть ли хороший способ сделать это?

Большое спасибо.

1 Ответ

1 голос
/ 18 марта 2011

В вашей спецификации есть один неясный момент: является ли подавление (3) только соответствием (4) совпадению (1) / (2) или более широким охватом?

Лучше всего разрешить с помощью конечного автомата.

my $state = 0;
while ($text =~ m#(?: finance (.*?) end
                  |   <class> (.*?) </class>
                  |   data    (.*?) </end>
                  |   begin   (.*?) </begin>
                  )
                 #sgx) {
  if (defined $1) {
    $state = ($state & ~4) | 1;
    print $1;
  }
  elsif (defined $2) {
    $state = ($state & ~4) | 2;
    print $2;
  }
  elsif (defined $3 and !($state & 4)) {
    print $3;
  }
  elsif (defined $4) {
    print $4;
    if ($state & 3) { # 1 OR 2
      $state = 4; # set 4, clear 1 and 2
    }
  }
  else {
    die 'Someone modified me without extending the state machine!';
  }
}

(Это синтаксис проверен, но не проверен; он достаточно сложен, чтобы можно было использовать образец данных).

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