我想使用量词的负面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)
您可以使用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)
对于指定的问题,您可以使用以下任一方法:
/(?<!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)
我给出了很多选择,因为没有一个是特别好的。实践中可能存在更好的解决方案,但这需要了解需要解决的实际问题。