我试图匹配任何不完全由大写或小写字母组成的单词,我写了以下正则表达式:
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])
如您所见,这不会匹配仅包含一种情况的字符串,因为两个前瞻都必须匹配。
当然,这只是执行两个正则表达式匹配并组合结果的复杂方法:
if ($line =~ /[A-Z]/ and $line =~ /[a-z]/)
关于regex - 在 perl 中的负前瞻表达式中正确使用插入符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18818084/