在使用正则表达式的场合,常常有这种需求,就是匹配一个不包含某个子串的子符串。比如说,我要从“eabcdfgh”得到"cd"之前的子串。有些人可能会写:

([^cd]*)

这种写法是彻底错误的,因为[]中的是集合,也就是说,[^cd]表示不等于c或者d,而不是cd。下面的程序中没有cd,但eab还是被匹配出来了。

  1. String s = "([^cd]*)";
  2. Match m = Regex.Match("eabcfgh", s);
  3. MessageBox.Show(m.Value);//eab
  4. MessageBox.Show(m.Groups[1].Value);//eab

上面这种写法是错的比较离谱的,正常青年一般都可以避免这种错误。在特殊情况下,正则表达式可以这么写,而且效率是比较高的。

([/s/S]*cd)

先说明下/s/S是表示匹配任何字符。所谓特殊情况,就是我知道这个字符串中必有cd的存在。假如,我的要求是匹配不包含cd的部分(为了描述方便,只匹配cd之前的部分),也就是说,当cd不存在时,应该把整个字符串都取出来。

  1. String s = "((.(?!cd))*.)";
  2. //String s = "([/s/S]*cd)";
  3. Match m = Regex.Match("eabcdfgh", s);
  4. MessageBox.Show(m.Value);//eab
  5. MessageBox.Show(m.Groups[1].Value);//eab

这种写法终于符合要求了。不过值得一提的是,相较前一种而言,它的效率比较低。

回顾一下相关的语法:

(?:子表达式)         定义非捕获组。

  1. //定义非捕获组
  2. String s = "e(?:ab)(.*)";
  3. Match m = Regex.Match("eabcd", s);
  4. MessageBox.Show(m.Value);//eabcd
  5. MessageBox.Show(m.Groups[1].Value);//cd

ab是被匹配的,但是它所在的组没有被捕获,Group[1]是cd

(?=子表达式)       零宽度正预测先行断言。

  1. //零宽度正预测先行断言
  2. //String s = "b(cd|de)(.*)";
  3. String s = "b(?=cd|de)(.*)";
  4. Match m = Regex.Match("eabcdfg", s);
  5. MessageBox.Show(m.Value);
  6. MessageBox.Show(m.Groups[1].Value);//区别 cd  cdfg

这种写法和注释掉的写法是有区别的,区别就是“零宽度”,这种写法会被捕获,也就是不占一个Group。

(?!子表达式)       零宽度负预测先行断言。

!表示非,就是不包含,同样是零宽度,不会被捕获。

(?<=子表达式)    零宽度正回顾后发断言。

例:(?<=19)\d{2}\b

“1851 1999 1950 1905 2003”中的“99”、“50”和“05”

(?<!子表达式)     零宽度负回顾后发断言。

例:(?<!19)\d{2}\b

“1851 1999 1950 1905 2003”中的“51”和“03”

参考文章: http://msdn.microsoft.com/zh-cn/library/az24scfc.aspx

转载于:https://blog.51cto.com/jianshusoft/766007

正则表达式-不包含某个字符串相关推荐

  1. 正则表达式不包含某个字符串_JMeter必知必会系列(18) JMeter正则表达式提取器疑难分析...

    JMeter正则表达式提取器疑难分析 前沿 JMeter正则表达式提取器的配置项中, Regular Expression, Template与 Match No.这三个配置项是比较难以理解的,本文针 ...

  2. 正则表达式 不含指定字符串

    假设需要不包含abc String s = "((.(?!abc))*.)"; 详细教程: 正则表达式-不包含某个字符串-木又寸的技术博客-51CTO博客 正则表达式语言 - 快速 ...

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

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

  4. 正则表达式包含某字符串且不包含某些字符串

    相对的包含某个单词 (?=abcd) 不包含某个单词,比如hello (?!abcd) 不包含某些字符的正则如下 var $sz = /[#$@/\()<>{}[] ]/gi;//常见的特 ...

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

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

  6. php 正则表达式不包含,不包含特定字符串的php正则表达式

    常用函数strstr($ str," abc"); 常规匹配preg_match(" /(abc)?/ is",$ str); 但是,如果要匹配没有特定字符串的 ...

  7. python 正则表达式解决包含且不包含某字符串的问题

    python 正则表达式解决包含且不包含某字符串的问题 本测试使用python的re.compile与re.search作为方法测试包含error不包含abc的实例 python简单正则里只介绍到了不 ...

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

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

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

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

最新文章

  1. [并查集][排序] Jzoj P4223 旅游
  2. Android获取手机短信
  3. SCSI 总线和协议
  4. 计算未来轻沙龙 | 顶会论文相继放榜,NLP领域有哪些最新进展?
  5. 本科、硕士、博士的区别(终极版,太形象了!)
  6. iOS:延时执行的三种方式
  7. Tricks (四十一)—— 一 list 两用
  8. mysql数据库的使用与理解( 基于ubuntu 14.0.4 LTS 64位)
  9. 华为NP课程笔记6-路由控制
  10. java社区团购微信小程序源码
  11. 塔防游戏制作教程(二)
  12. 又一个程序员倒下-程序员防猝死指南
  13. 教你如何写出完美的论文——5. 做笔记
  14. ACCESS实例2 资料管理1——表、表关系与查询
  15. 微信小程序获取用户头像和昵称(填写头像昵称能力)
  16. Subpalindromes
  17. H5页面自适应各种手机端屏幕分辨率的大小
  18. android环信聊天界面上面显示昵称,【环信征文】在android中5分钟实现环信昵称头像的显示...
  19. cf四大服务器位置,CF:从最初的42个服务器到现在的四大战区,穿越火线还能火多久?...
  20. 制作一个小的彩票系统

热门文章

  1. Abaqus简史:“黑科技”之路
  2. 浅析巴西恶意软件进化史
  3. 2023年必须收藏的python兼职网站大全
  4. 每日学习 1153--1164
  5. STM32F03ZET6 板子--DMA
  6. 高性能计算之九-GPU在ANSYS高性能仿真计算中的应用
  7. c语言32位数如何判断溢出,单片机程序状态字PSW的OV位到底是怎么判断溢出的?有CY位不就够了么?...
  8. Java中带返回值的方法
  9. 科创人·弘玑Cyclone CEO高煜光:从RPA到超自动化,以客户需求构建战略纵深
  10. 让STM32CubeMX带你飞,菜鸟秒变STM32高手