我试图压制以[T
开头的字符串,而不进行正匹配并否定结果。
my @tests = ("OT", "[T","NOT EXCLUDED");
foreach my $test (@tests)
{
#match from start of string,
#include 'Not left sq bracket' then include 'Not capital T'
if ($test =~ /^[^\[][^T]/) #equivalent to /^[^\x5B][^T]/
{
print $test,"\n";
}
}
输出
NOT EXCLUDED
我的问题是,有人可以告诉我为什么OT
被排除在上面的例子中?
修改 感谢各位回复,我可以看到我有点屈膝。
答案 0 :(得分:5)
正则表达式^[^\[][^T]
匹配以[
以外的字符开头的字符串,后跟T
以外的字符。
由于OT
将T
作为第二个字符,因此不匹配。
如果您想匹配除[T
之外的任何字符串,您可以执行以下操作:
if ($test =~ /^(?!\[T)/) {
print $test,"\n";
}
答案 1 :(得分:1)
YAPE::Regex::Explain可能会有所帮助:
$ perl -MYAPE::Regex::Explain -E 'say YAPE::Regex::Explain->new(qr/^[^\[][^T]/)->explain'
The regular expression:
(?-imsx:^[^\[][^T])
matches as follows:
NODE EXPLANATION
----------------------------------------------------------------------
(?-imsx: group, but do not capture (case-sensitive)
(with ^ and $ matching normally) (with . not
matching \n) (matching whitespace and #
normally):
----------------------------------------------------------------------
^ the beginning of the string
----------------------------------------------------------------------
[^\[] any character except: '\['
----------------------------------------------------------------------
[^T] any character except: 'T'
----------------------------------------------------------------------
) end of grouping
----------------------------------------------------------------------
答案 2 :(得分:0)
你的正则表达式转换为:
从输入开始,匹配除开放方括号( [)之外的任何内容,后跟除了大写字母T之外的任何内容
答案 3 :(得分:0)
你的表达式相当于“以NOT开头[并且第二个不是T”,因此唯一通过的表达式不排除,因为在OT中,第二个字母是T