如何使用量词的负面观察?

Rom*_*kii 4 regex perl

我想使用量词的负面lookbehind.但我有错误.我用Perl.

我有几个文本文件,我需要检测它们在不同的单词之前有特殊的文本前缀.

错误:

外观内部的量词使其成为非固定宽度

我的正则表达式:

/(?<!big([\s]+)?)dog/
Run Code Online (Sandbox Code Playgroud)

我想得到第四和第五个数字.

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
Run Code Online (Sandbox Code Playgroud)

cho*_*oba 7

您可以使用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;
Run Code Online (Sandbox Code Playgroud)

qr/(?<!big)\s*dog/ 是有问题的

big dog
    ^
    |
matches here: is not preceded by "big" but "big "
Run Code Online (Sandbox Code Playgroud)


ike*_*ami 5

对于指定的问题,您可以使用以下任一方法:

/(?<!big)(?<!\s)\s*dog/
Run Code Online (Sandbox Code Playgroud)

或者

/
   ^
   (?: big \s* dog
   |   (?! big \s* dog ) .
   )*
   dog
/xs
Run Code Online (Sandbox Code Playgroud)

或者

/
   (?: (?:^|[^b]) ig
   |   (?:^|[^i]) g
   |   (?:^|[^g\s])
   )
   \s* dog
/x
Run Code Online (Sandbox Code Playgroud)

或者

s/big\s*dog/!/rg =~ /dog/
Run Code Online (Sandbox Code Playgroud)

或者

reverse($_) =~ /god(?!\s*gib)/
Run Code Online (Sandbox Code Playgroud)

我给出了很多选择,因为没有一个是特别好的。实践中可能存在更好的解决方案,但这需要了解需要解决的实际问题。