Как использовать отрицательный взгляд с квантификаторами? - PullRequest
0 голосов
/ 14 декабря 2018

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

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

Ошибка:

Кванторвнутри взгляд назад делает его нефиксированной ширины

Мое регулярное выражение:

/(?<!big([\s]+)?)dog/

Я хочу получить четвертое и пятое число.

1. bigdog - not ok
2. big   dog - not ok
3. big dog - not ok
4. dog - ok
5. dog any text except big.  dog - ok

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Для указанной проблемы вы можете использовать любое из следующих:

/(?<!big)(?<!\s)\s*dog/

или

/
   ^
   (?: big \s* dog
   |   (?! big \s* dog ) .
   )*
   dog
/xs

или

/
   (?: (?:^|[^b]) ig
   |   (?:^|[^i]) g
   |   (?:^|[^g\s])
   )
   \s* dog
/x

или

s/big\s*dog/!/rg =~ /dog/

или

reverse($_) =~ /god(?!\s*gib)/

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

0 голосов
/ 14 декабря 2018

Вы можете использовать глаголы SKIP и FAIL.

#! /usr/bin/perl
use warnings;
use strict;

use Test::More tests => 7;

my $regex = qr/big\s*dog(*SKIP)(?!)|dog/;

unlike 'bigdog',    $regex;
unlike 'big dog',   $regex;
unlike 'big   dog', $regex;
unlike 'cat',       $regex;

like 'dog',       $regex;
like 'small dog', $regex;
like 'medium dog and big dog', $regex;

qr/(?<!big)\s*dog/ проблематично, так как

big dog
    ^
    |
matches here: is not preceded by "big" but "big "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...