首页 > 其他分享 >正则表达式-逻辑”非“处理(记录)

正则表达式-逻辑”非“处理(记录)

时间:2022-10-16 01:00:29浏览次数:82  
标签:字符 逻辑 cut 匹配 记录 正则表达式 unwanted unfavored

正则表达式-逻辑”非“处理(记录)

“非”是正则表达式中最难处理的逻辑关系。因为没有直接对应的结构,“非”的处理比较吃力。

  最简单的“非”,意思是此处不能出现某个字符,这一点通常很直观,似乎用排除型字符组『[…]』就可以解决。比如双引号字符串的匹配,首尾两个双引号很容易匹配,其中的内容肯定不是双引号(暂时不考虑转义的情况),所以可以用『["]』表示即可,其长度不确定,所以用来限定,所以整个表达式就是『"[^"]"』,非常简单。

  但是,事情果真都如此简单吗?我们仍然举cat和cut的例子,如果仍然希望匹配c开头、t结尾的单词,但不希望匹配cut,可以写成『c[^u]t』,是否就可以了?

  这个表达式的意思是:最开头的字母是c,之后是一个不为u的字符,之后是t。没错,它确实不会匹配cut,也可以匹配cat。但是,chart、conduct、court等等,它也没法匹配,因为[^u]的意思是:匹配一个不是u的字符。

  那么,把『[u]』改成『[u]+』好了,这样应该就可以解决问题了。但是真的如此吗?『[u]+』的意思是,一个或若干(最多到无穷)个字符,但每一个字符都不能是u。所以,尽管『c[u]+t』能匹配cat和chart,却不能匹配conduct和court。

  看来,“非”真是比较难对付,让人非常纠结。好在,也不是没有办法解决它。回复到与-或-非的观点,分析要实现的功能:

逻辑关系 分析
以c开头,以t结尾
c和t之间可以出现的字母必须多于一个,没有上限
c和t之间不能只有一个字符u

  如果只考虑“与”和“或”两个逻辑,表达式很好写,是『c[a-z]+t』,再把剩下的条件附加上去,就可以解决问题了。我们仔细看“非”的条件:c和t之间不能只有一个字符u。既然『[^u]+』表达的并不是这个意思,我们不妨换一种表述法:在c之间的位置向后看,不能出现cut。这一点,正好对应否定顺序环视(positive look-ahead)功能,『(?!cut)』就是用来进行这种判断的,它判断之后的字符串能不能由cut匹配,但并不真正真正进行匹配,也不会移动“当前位置”。所以我们将它放在表达式的最开头,得到『(?!cut)c[a-z]+t』。这个表达式的逻辑是:只有在当前位置右侧字符串不能由cut匹配的情况下,才从这里开始,向右尝试用c[a-z]+t。

  如果我们更进一步,需要排除掉cat和cut,可以把否定顺序环视改为『(?!c[au]t)』。这样就能保证,匹配到的肯定不是cat或者cut。

  更复杂一点,如果我们要验证这样一个字符串:它全部由小写字母构成,长度不超过12位,其中不能包含unfavored或者unwanted。也可以照章处理,先匹配“长度不超过12位”的小写字母『[a-z]{,12}』,然后写出匹配“不需要匹配内容”的正则表达式,『(unfavored|unwanted)』,再用否定顺序环视将它“排除”即可,只是这次要注意,不能直接写『(?!(unfavored|unwanted))』,因为它只能排除『(unfavored|unwanted)』出现在字符串开头的情况,为了排除它出现在字符串中的情况,我们要把否定顺序环视改为『(?![a-z](unfavored|unwanted))』,这样就确保完整的“排除”,整个表达式就是『(?![a-z](unfavored|unwanted))[a-z]{,12}』。

  总结一下,正则表达式中的“非”,除去能用排除型字符组直接表示的,复杂一点的“非”逻辑都是按照这样的思路进行的:先用一个正则表达式准确匹配需要“排除”的字符串,再用环视功能排除掉它——“非”确实是正则表达式中,最难处理的逻辑关系,好在它并不复杂,而且,除去一些比较古老的工具(比如Apache 1.3),现在各种工具和语言,基本都支持这种功能。

参考链接:

https://kb.cnblogs.com/page/96414/

标签:字符,逻辑,cut,匹配,记录,正则表达式,unwanted,unfavored
From: https://www.cnblogs.com/jianmuzi/p/16795491.html

相关文章

  • 【教程记录】如何卸载永中office
    场景:偶然发现永中office的卸载有点与众不同,无奈上网查了一下,竟然这样就可以了,是我见过的唯一一款需要这样卸载的软件,记录下来以留用。过程:文章中的截图除了最后一张是我自己......
  • F5 LTM fullnat模式测试记录及配置
    基础信息拓扑图F5版本Web:Statistics->Dashboardtmsh:root@(test)(cfg-syncStandalone)(Active)(/Common)(tmos)#showsysversionSys::VersionMainPackage......
  • 正则表达式
    格式正则表达式以/开始,以/结束中间包含字符串的匹配规则。/a/匹配字符串中的第一个a字符,/abc/表示匹配连续的abc字符。常用符号[]表示当前字符位置匹配的......
  • 记录--关于 HTML5 LocalStorage 的 5 个不为人知的事实
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助LocalStorage是HTML5中一个方便使用的API,它为Web开发人员提供了一个易于使用的5MB的存储空间。使用L......
  • 刚看完spaceX记录片《回到太空》
    刚看完这部《回到太空》,跟前几周看的那部《不要抬头看》刚好形成对比,一部是记录片,真实人的情感,一部是名演员,但是所描述的也很宏观。之前看过埃隆马斯克的自传,虽然还没......
  • 移除List的统一逻辑写法 LeetCode 203
    原理:通过创建一个新的结点,放在头结点的前面,作为真正头结点的前驱结点,这样头结点就成为了意义上的非头结点,这样就可以统一操作结点的删除操作。需要注意的是:这个新的结点是......
  • [ds 记录]P5901 [IOI2009]Regions
    这道题的难点,恐怕在复杂度分析(link首先我们可以自由选择把询问放到上面或下面。放到上面,等价于对每个点求其子树内有多少某颜色的点;放到下面,等价于对每个点求其祖先中有......
  • c++游戏客户端修改记录
    c++游戏客户端编译原代码是基于WTL8.0的,可能是vs2005版本编译。本次使用vs2013升级,之后主要遇到的错误记录在此,最后编译成功了项目中已经引入了wtl8的头文件到include......
  • SAP Spartacus HTTP Interceptor 的 provisioning 逻辑
    假import{Injectable}from'@angular/core';import{HttpEvent,HttpInterceptor,HttpHandler,HttpRequest}from'@angular/common/http';import{Observable......
  • 树形DP做题记录
    “访问”美术馆树形背包问题。容易将美术馆转化成一棵二叉树,将展厅也视为走廊,每个走廊对应二叉树上一个节点。对于这种读入方式可以采用递归建树。记\(t_{cost}\)为通......