我想在量词后面使用负向后看。但是我有错误。我使用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
答案 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。