grep的-v参数会查找与正则表达式不匹配的所有字符串。 那个有直接使用正则来达到同样目的的方法吗?
答案是肯定的。 利用“零宽度断言”就可以了。 但是,首先请允许我对“零宽度断言”这个概念进行说明。
我不知道是谁翻译的,听起来不是很勉强吗? 实际上,零宽度意味着匹配的部分没有长度。 例如,如果匹配一个语句中以ing结尾的词,但要求匹配结果不包含ing本身,则ing的宽度为零。 “断言”是assert (我很好奇为什么被翻译成断言),其实是验证的意思。
列举一下使用了零宽度断言的栗子。 给定一组文件名,找到jpg格式的文件名。 jpg本身不包含在内。 零宽度啊。 相对来说,你可能更熟悉JavaScript的正规规则和使用方法。 我稍后将使用JavaScript的String.prototype.match方法举例说明
var files=['foo.jpg ',' bar.png ',' baz.gif'];
files.foreach(function ) (文件)。
console.log(file.match(/^.)?=.jpg$ ()/) );
);
结果只有foo.jpg可以返回匹配结果,结果为['foo'],不包含扩展名。
(?=)称为正预测,相反,负预测是(? 表示后面没有特定的文字
file.match(/^.)? .jpg$(/
与所有文件名一致,返回['foo.jpg']、['bar.png']、['baz.gif']这样的结果。 为什么foo.jpg还匹配呢? 而且也包括扩展名吗? 仔细想想,我觉得上面的结果其实没有问题。 匹配foo.jpg,其最后一个字符g的后面也确实不是.jpg$,所以匹配也就不足为奇了。
到此为止,问题似乎不明确,即使使用负的预测,也不能选择以. jpg结尾的文件名吗? 其实再加一个条件就好了。 文件名的末尾必须是.w $,但不能是.jpg$
file.match(/^.)?=.w $ )? .jpg$(/
变更后的执行观察结果foo.jpg不再一致,一致结果中不再包含扩展名。
如上面实例所示,正预测和负预测可以合并使用。 如果不满足两个条件,就不能匹配。 即使改变上面的正预测和负预测的公式,效果也是一样的。
如果不需要检索匹配结果,而只需要知道是否匹配,则可以使正则表达式更简单。 举个有用的例子,在NGINX的设置中,如果用户访问的路径不以. php结尾,则让NGINX直接返回此文件,并添加长的缓存头信息。
location ~ . php$ ) {
expires max;
}
另外,说明如何使用正则表达式进行测试时,正则表达式实际上也有多个。 因为我们如上所述是perl样式的正则表达式,所以在grep中测试时请记住使用-P参数来启用以上正则表达式。 但是,也请注意grep的版本。 MacOS附带的grep不支持-P参数。
grep -P -e '^ (! (jpg )…) *
这个问题在segmentfault.com上进行了介绍
写累了,服务器越来越贵
寻求分担,祝好人一生平安
天使夸奖人