【发布时间】:2013-09-15 22:22:44
【问题描述】:
我正在尝试匹配任何不完全由大写或小写字母组成的单词,并且我编写了以下正则表达式:
if ($line =~ /(?!^[A-Z][A-Z]+(\s*)$)(?!^[a-z][a-z]+(\s*)$)/) {
print $line;
}
下面的表达式应该匹配所有大写字母的单词
(?!^[A-Z][A-Z]+(\s*)$)
这应该匹配所有小写字母的单词
(?!^[a-z][a-z]+(\s*)$)
我将两者结合起来并尝试将其与以下单词匹配:ASDSFSDF、asdfasdfasdf 和 asdasdfFFFdsfs。我注意到它匹配一切。仅当我将插入符号移到括号外时,如下所示:
^(?![A-Z][A-Z]+(\s*)$)^(?![a-z][a-z]+(\s*)$)/)
我是否看到它只加工 asdasdfFFFdsfs。有人可以向我解释为什么我需要将运算符移到负前瞻表达式之外?我是 regexp 的新手,我很困惑。
谢谢。
【问题讨论】:
-
[A-Z][A-Z]+部分等同于[A-Z]{2,},这意味着它将匹配至少两个或多个大写字母。也许这就是你想要做的,在这种情况下,后一种正则表达式更具可读性,IMO。