如何对量词使用负向后看?

时间:2018-12-14 14:38:08

标签: regex perl

我想在量词后面使用负向后看。但是我有错误。我使用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 :(得分: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;

qr/(?<!big)\s*dog/存在问题

big dog
    ^
    |
matches here: is not preceded by "big" but "big "

答案 1 :(得分:4)

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

/(?<!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)/

我提供了许多替代方法,因为没有一个特别好。在实践中可能存在更好的解决方案,但这需要知道需要解决的actual problem