这篇文章主要介绍了正则表达式匹配不包含某些字符串的技巧,详细分解了应该怎么做和这么做的原因,需要的朋友可以参考下

经常我们会遇到想找出不包含某个字符串的文本,程序员最容易想到的是在正则表达式里使用,^(hede)来过滤”hede”字串,但这种写法是错误的。我们可以这样写:[^hede],但这样的正则表达式完全是另外一个意思,它的意思是字符串里不能包含‘h',‘e',‘d'三个但字符。那什么样的正则表达式能过滤出不包含完整“hello”字串的信息呢?

事实上,说正则表达式里不支持逆向匹配并不是百分之百的正确。就像这个问题,我们就可以使用否定式查找来模拟出逆向匹配,从而解决我们的问题:

^((?!hede).)*$

上面这个表达式就能过滤出不包含‘hede'字串的信息。我上面也说了,这种写法并不是正则表达式“擅长”的用法,但它是可以这样用的。

解释

一个字符串是由n个字符组成的。在每个字符之前和之后,都有一个空字符。这样,一个由n个字符组成的字符串就有n+1个空字符串。我们来看一下“ABhedeCD”这个字符串:

所有的e编号的位置都是空字符。表达式(?!hede).会往前查找,看看前面是不是没有“hede”字串,如果没有(是其它字符),那么.(点号)就会匹配这些其它字符。这种正则表达式的“查找”也叫做“zero-width-assertions”(零宽度断言),因为它不会捕获任何的字符,只是判断。

在上面的例子里,每个空字符都会检查其前面的字符串是否不是‘hede',如果不是,这.(点号)就是匹配捕捉这个字符。表达式(?!hede).只执行一次,所以,我们将这个表达式用括号包裹成组(group),然后用*(星号)修饰——匹配0次或多次:

你可以理解,正则表达式((?!hede).)*匹配字符串"ABhedeCD"的结果false,因为在e3位置,(?!hede)匹配不合格,它之前有"hede"字符串,也就是包含了指定的字符串。

在正则表达式里, ?! 是否定式向前查找,它帮我们解决了字符串“不包含”匹配的问题。

以下是一些补充:

分享下php生成随机数的三种方法,生成1-10之间的不重复随机数,php生成不重复随机数的例子,需要的朋友参考下。

在hacker news上看到regex golf,几道很有趣的正则表达式的题,有的需要用到不匹配这种匹配,比如需要匹配不包含某个单词的串。

开始正题之前,先来看看正则表达式的语法:

[abc] a或b或c . 任意单个字符 a? 零个或一个a
[^abc] 任意不是abc的字符 \s 空格 a* 零个或多个a
[a-z] a-z的任意字符 \S 非空格 a+ 一个或多个a
[a-zA-Z] a-z或A-Z \d 任意数字 a{n} 正好出现n次a
^ 一行开头 \D 任意非数字 a{n,} 至少出现n次a
$ 一行末尾 \w 任意字母数字或下划线 a{n,m} 出现n-m次a
(...) 括号用于分组 \W 任意非字母数字或下划线 a*? 零个或多个a(非贪婪)
(a|b) a或b \b 单词边界 (a)...\1 引用分组
(?=a) 前面有a (?!a) 前面没有a \B 非单词边界

正则表达式中有(?=a)和(?!a)来表示我们是否需要匹配某个东西。

所以,有需要不匹配某样内容时,就可以用(?!a)了。比如要匹配不含hello的字符串就可以这样写。

^(?!.*hello)

这里.*用来表示hello之前可能有其他的字符,为什么还要加^呢,因为如果不加的话,可能匹配到h之后的这个位置上了。

现在就可以解决regex golf上的abba这道题了。
这道题是去匹配不含abba这种形式的单词,比如abba,anallagmatic就不应该匹配上。

正则表达式代码:

^(?!.*(.)(.)\2\1)

然后利用不匹配,还可以解决prime这道题,这道题匹配有素数个x的串,先看正则。

^(?!(xx+)\1+$)

(xx+)是匹配2个及2个以上的x,(xx+)\1+就是匹配重复出现2个及以上的串,所以(xx+)\1+就表示了那些非素数的串,那么素数串就是除去这些非素数串,即是以上的正则表达式了。

正则表达式匹配不包含某些字符串的技巧相关推荐

  1. 正则表达式匹配“不包含某些字符串”的技巧

    这篇文章主要介绍了正则表达式匹配不包含某些字符串的技巧,详细分解了应该怎么做和这么做的原因,需要的朋友可以参考下 经常我们会遇到想找出不包含某个字符串的文本,程序员最容易想到的是在正则表达式里使用,^ ...

  2. python3正则表达式匹配但不包括最后一个字符_正则表达式匹配不包含某些字符串的技巧...

    经常我们会遇到想找出不包含某个字符串的文本,程序员最容易想到的是在正则表达式里使用,^(hede)来过滤"hede"字串,但这种写法是错误的.我们可以这样写:[^hede],但这样 ...

  3. 正则表达式匹配不包含特定字符串解决匹配溢出问题

    匹配溢出问题在正则表达式当中算是比较常见的问题,它常常导致我们匹配结果莫名其妙的出错,本文专门为你讲解如何通过匹配不包含特定字符串的方法来解决这类问题. 那么,什么是匹配溢出呢? 下面我们来看个例子: ...

  4. 正则表达式 匹配不包含指定字符串的方法

    我们经常会遇到想找出不包含某个字符串的文本,比如我要匹配不含有20211229 和 20211230的字符串. 正则表达式中有(?=a)和(?!a)来表示我们是否需要匹配某个东西. 所以,有需要不匹配 ...

  5. 正则表达式总结,正则表达式匹配不包含某个字符串

    1.匹配a标签及其url: Regex regA = new Regex(@"<a[\s]+[^<>]*href=(?:""|')([^<> ...

  6. python不包含某字符_python正则表达式匹配不包含某几个字符的字符串方法

    python正则表达式匹配不包含某几个字符的字符串方法 一.匹配目标 文件中所有以https?://开头,以.jpg|.png|.jpeg结尾的字符串 二.尝试过程 1) 自然想到正则表达式r'(ht ...

  7. java 正则 不包含_java使用正则表达式匹配不包含某个规则的字符串

    测试数据: 例如上面这几条简单的日志条目,我们想实现两个目标: 1.把8号的数据过滤掉: 2.把那些不包含robots.txt字符串的条目给找出来(只要Url中包含robots.txt的都给过滤掉). ...

  8. 正则表达式怎样匹配 不包含特定字符串的字符串

    正则表达式匹配公式为:^((?!XXX).)*$, XXX为字符串. 转载于:https://www.cnblogs.com/lixiaolun/p/5627254.html

  9. java判断字符串是否包含某个字符串_Bash技巧:使用[[命令的 =~ 操作符判断字符串的包含关系...

    在 Linux bash shell 中,可以使用 [[ 命令来进行判断. 其中,可以使用 [[ 命令的 =- 操作符来判断某个字符串是否包含特定模式. 查看 man bash 对 [[ 命令的 =~ ...

最新文章

  1. JAVA之JVM垃圾回收(GC)机制详解
  2. 数据结构与算法—单源最短路径dijkstra算法
  3. python函数中把列表(list)当参数时的入坑与出坑
  4. PyCharm配置django环境
  5. SCCM 2012安装部署三:客户端管理
  6. 商业智能BI软件的价值有哪些
  7. Security+ 学习笔记5 常见的网络攻击
  8. PDF转图片的所有可行方法,全部都在这里了!
  9. html5 svg编辑器,HTML5 之 SVG
  10. 局域网和内网?系统远程桌面和内网远程软件?
  11. 2020 年省份数据拉取
  12. 求助可移动磁盘显示没有格式化
  13. 基因编辑最新进展2021年5月
  14. fpga加载程序慢_FPGA JTAG接口下载速度很慢
  15. 串联谐振耐压试验装置技术参数和特点,如何选择
  16. URLRewrite地址重定向的实现
  17. malloclab 实验详解(动态分配器如何设计)
  18. 不得了了!刚刚腾讯官宣 Python 开发人才这样选
  19. Pycharm配置环境本地训练yolov5(车辆检测)
  20. 倍福NC轴编码器Enc parameters释义

热门文章

  1. 智能牙刷不再是简单的3C产品,更应该是智能口腔管家
  2. html 微信无法获取图片,微信浏览器input file 图片选择问题,获取不到图片的type等信息...
  3. 笔记:鸟哥的Linux私房菜(一)
  4. win10 64位下Python最新版安装过程及破解
  5. 针对Win10中Win键+R运行没有历史记录解决方法
  6. 深度神经网络加速库cuDNN简介
  7. 玩转Git三剑客——04. 创建第一个仓库并配置local用户信息、05. 通过几次commit来认识工作区和暂存区...
  8. 毕设 房价预测分析与可视
  9. 第十八周学习周报(20180702-20180708)
  10. Cadence Allegro PCB快捷键设置