正则表达式里字符串”不包含”匹配技巧

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

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

^((?!hede).)*$

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

解释

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

 +--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+ S = |e1| A |e2| B |e3| h |e4| e |e5| d |e6| e |e7| C |e8| D |e9| +--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+ index 0 1 2 3 4 5 6 7 

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

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

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

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

[英文原文:
Regular expression to match string not containing a word?
 ]

文章来自:
外刊IT评论

?

时间: 2024-10-11 20:36:27

正则表达式里字符串”不包含”匹配技巧的相关文章

java 正则表达式 验证字符串 只包含汉字英文数字

String content = “testContent”; String regex="^[a-zA-Z0-9\u4E00-\u9FA5]+$"; Pattern pattern = Pattern.compile(regex); Matcher match=pattern.matcher(content); boolean b=match.matches(); if(b) { Toast.makeText(this, "success...", Toast.L

正则表达式,判断一串字符串里面包含一定的形式,并解析成图片

这个事写qq表情的时候用到的,单独拿出来讲讲. 首先图片0到106张放在res里面,命名为F000到F106 如图 此时在程序里面定义一个方法 public void setData(String msg){ String str = msg; //消息具体内容 String zhengze = "f0[0-9]{2}|f10[0-7]"; //正则表达式,用来判断消息内是否有表情 try { SpannableString spannableString = ExpressionUt

正则表达式替换和不包含指定字符串

需求 展示一段文字,段落中有些特殊标记的人名.刊名等,格式大体是:“(作者<刊名>其他)”,某个字段可以为空,比如作者为空. 那么对应的正则大体是这样的   '\((.*?)<(.*?)>.*?\)' 最终的效果是 “(<a>作者</a><<a>刊名</a>>其他)” 第一版 1 class Program 2 { 3 static string str = @"<p>[例]当夫广州之首难,武汉兴师,

Python: 字符串搜索和匹配,re.compile() 编译正则表达式字符串,然后使用match() , findall() 或者finditer() 等方法

1. 使用find()方法 >>> text = 'yeah, but no, but yeah, but no, but yeah' >>> text.find('no')10 2. 使用re.match() 对于复杂的匹配需要使用正则表达式和re 模块.为了解释正则表达式的基本原理,假设想匹配数字格式的日期字符串比如11/27/2012 ,可以这样做:>>> text1 = '11/27/2012'>>> text2 = 'Nov

[转]notepad++正则表达式替换字符串详解

原文:http://blog.csdn.net/qinboecjtu/article/details/6035028 正则表达式是一个查询的字符串,它包含一般的字符和一些特殊的字符,特殊字符可以扩展查找字符串的能力,正则表达式在查找和替换字符串的作用不可忽视,它 能很好提高工作效率. EditPlus的查找,替换,文件中查找支持以下的正则表达式: 表达式 说明 /t 制表符. /n 新行. . 匹配任意字符. | 匹配表达式左边和右边的字符. 例如, "ab|bc" 匹配 "

正则表达式提取字符串

匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:ns*r 评注:可以用来删除空白行 匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? /> 评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力 匹配首尾空白

正则表达式和字符串处理

正则表达式和字符串处理 来源 https://www.cnblogs.com/helloczh/articles/1648029.html 第一章        正则表达式概述 正则表达式(Regular Expression)起源于人类神经系统的研究.正则表达式的定义有以下几种: l         用某种模式去匹配一类字符串的公式,它主要是用来描述字符串匹配的工具. l         描述了一种字符串匹配的模式.可以用来检查字符串是否含有某种子串.将匹配的子串做替换或者从中取出符合某个条件

输入字符串,包含数字,大小写字母,编程输出出现做多的数字的和

题目描述: 输入字符串,包含数字,大小写字母,编程输出出现做多的数字的和. 思路: 1.创建输入对象2.输入字符串3.利用正则将字母分离出,剩余的每一个字符串即为待统计的每一个数字,存入字符串数组中 4.遍历数组,拿到字符串,存入创建的hashMap中,且键为该字符串,值为出现的次数:这里我使用的判断出现几次的技巧是借助hashSet的存储非重复元素的性质,每次拿到数组元素时同时进行存入hashSet的操作(具体代码中会有) 4.此时的hashMap中存储的即为出现的数字及其出现次数的对应键值对

Substring with Concatenation of All Words, 返回字符串中包含字符串数组所有字符串元素连接而成的字串的位置

问题描述:给定一个字符数组words,和字符串s,返回字符数组中所有字符元素组成的子串在字符串中的位置,要求所有的字符串数组里的元素只在字符串s中存在一次. 算法分析:这道题和strStr很类似.只不过strStr是子串,而这个题是字符串数组里的元素组成的子串,字符串数组里的元素是无序的,但是必须全部包含.所有考虑使用map集合.关键点在于几个临界值,字符串元素在s中重复了怎么做,找到一个符合的子串后怎么做,有字符串元素不匹配怎做. import java.util.ArrayList; imp