利用正則表達式排除特定字符串

本文转载自:http://www.cnblogs.com/wangqiguo/archive/2012/05/08/2486548.html

查找不以baidu开头的字符串

baidu.com
sina.com.cn

正则:^(?

!baidu).*$  匹配结果就是第2行。也就是第1行被排除了
这里使用了零宽度断言(?!exp),注意。我们有一个向前查找的语法(也叫顺序环视)  (?=exp)
(?=exp) 会查找exp之前的【位置】假设将等号换成感叹号。就变成了否定语义,也就是说查找的位置的后面不能是exp
普通情况下?

!要与特定的锚点相结合,比如^行开头或者$行结尾,那么上面的样例的意思例如以下:
^(?!baidu).*$ 先匹配一个行开头的位置,而且要求接下来的位置的后面不是baidu这个字符串。这样由于第一行^之后的位置后面是baidu所以匹配失败,被排除在外了。

查找不以com结尾的字符串

www.sina.com.cn
www.educ.org
www.hao.cc
www.baidu.com
www.123.com

正则 ^.*?

(?<!com)$  匹配前3行结果。

假设查找以com结尾的字符串则使用正则 ^.*?(?

<=com)$或者 ^.*?

com$  
对正則表達式的解释:^.*?(?

<!com)$
首先匹配行开头,然后是 .*? 这个是忽略优先,也就是优先忽略不匹配不论什么字符,(?<!com) 这个是一个逆序环视的否定形式。意思是匹配一个位置此位置的前面不能是字符串com。最后是一个行结束。

对于www.123.com来说。首先匹配行首。接着匹配w后面的位置,发现前面不是com。所以成功但紧接着要匹配行尾。失败,回溯让.*? 匹配一个w符号。接着(?

<com)匹配第二个w后面的位置。发现前面也不是com匹配成功,紧接着要匹配$相应的行尾失败,一直到.*?匹配了www.baidu.com的时候。此时(?

<!com)匹配m后面的位置,此时此位置的前面是com匹配直接失败,接着.*?匹配行末尾,(?<!com)匹配$后面的位置。显然这次也失败了。所以整个全局匹配都失败。  www.123.com被排除到匹配之外。

这里的.*后面加不加问号结果都一样。

查找不含有if的行

if (a>b)
printf("hello");
else if(a<b)
printf("hello2");
else
printf("hello3");

正则 ^([^f]|[^i]f)+$
事实上这个匹配也是一个排除型字符串的匹配,可是不同于上面两种,由于这里的if可能既不在行开头,也不在行结尾。而是在字符串中间这样就给匹配带来了麻烦。在正則表達式中没有提供相似排除的功能。我们最easy想到的就是以下的正则:
^[^if]+$ 这样的写法看起来是那么回事,可是排除型字符组排除的是i和f两个字符。而不是if这个字符串。所以这个正則表達式匹配的是那些既没有i字符也不包括f字符的字符串。

可是假设字符串中有一个i或多个i或者有一个或多个f,或者i和f字符都有仅仅只是没有连在一起。这些情况都是我们须要匹配的情况,而我们不能匹配的情况是那些包括if字符串的行。而不是包括i或f字符的行,所以这样的写法漏洞非常大。

^.*(?!if).*$ 这样的写法使用了零宽度断言。表面意思看起来好像是说 随意字符+非if+随意字符 组成了整个字符串。可是细致研究匹配过程就知道这个是错的。(?

if)匹配的是一个位置。所以对于字符串aifb他也是能够匹配到的,而实际上这样的字符正是我们不要的。依照这个正則表達式。对于aifb 首先匹配行首,其次.*是贪婪模式(匹配优先),会一直匹配到字符串的末尾(此时传动装置定位在$位置前面),此时(?!if)须要匹配一个位置,这个位置的后面不能是if,这个时候正好位置在b字符的后面,符合匹配条件,紧接着匹配行尾,到这里整个全局匹配成功。

也就是说对于一个字符串比如我要排除abc这个字串,那么对于随意一个字符串   helloworld abc helloworld 在匹配的时候(?!abc)能够匹配h、e、l、l、o、w、o、r、l、d等这些字符后面的位置,都是成功的。所以匹配根本还没有进行到abc这个地方,(?

!abc)就会匹配成功。这个时候根本起不到排除的作用。为什么上面的第1和第2个样例能够呢,由于他们的位置有行首和行尾限定。比如我要匹配行首不是abc的话,那么此时^(?

!abc) 这个时候(?!abc)实际上在匹配的时候其传动装置的位置被行首进行了限定,所以对于那些以abc开头的字符串来说就会匹配失败了。

对于正則表達式^.*(?!abc).*$怎么能让第一个.*匹配到 helloworldabcxxx中的helloworld的问题。

对于上面的题目,我们的答案是^([^f]|[^i]f)+$  事实上就将全部的匹配分成了2种情况,一种情况是假设字符串中没有f字符,    自然就不可能有if字符串了。这样的情况下匹配的字符串中是不可能有if的。另外一种情况就是有f字符。可是我们要求此时f的前面不能是i,所以在有f和没有f两种情况都考虑到的情况下,这个正则就应该能够满足全部的情况了。

事实上这个问题的解答是不完美的。对于排除的字符串if仅仅有2个字符i和f字符,我们能够使用这样的方式。可是假设我们要排除的是字符串helloworld,这样的方法显然就不有用了,那要考虑到多少种情况呢?

排除不含有某字符串的终于方案:在这样的情况下我们使用  ^(?!.*helloworld).*$  正則表達式  我们将第一个.*移到了零宽度断言的里面。在匹配的时候首先匹配行首的位置,然后接下来是匹配行首后面的位置,要求此位置的后面不能是    .*helloworld 匹配的字符串,说白了要求此位置的后面不能是xxxxxxxxxxxxxxxxxxhelloworld 相似的字符串。这样就排除了从行首開始后面含有helloworld的情况了。

时间: 2024-08-03 12:21:35

利用正則表達式排除特定字符串的相关文章

java中用正則表達式推断中文字符串中是否含有英文或者数字

public static boolean includingNUM(String str)throws  Exception{ Pattern p  = Pattern.compile("[\u4e00-\u9fa5]*[\\d|\\w]+[\u4e00-\u9fa5]*"); //或者  Pattern p  = Pattern.compile("[\u4e00-\u9fa5]*[0-9|a-z|A-Z]+[\u4e00-\u9fa5]*"); Matcher

iOS正則表達式(一)

什么是正則表達式? 正則表達式是对字符串操作的一种逻辑公式. 作用? 在iOS开发中我们通常使用正則表達式来匹配给定的字符串是否符合我们的业务逻辑,比方说用户注冊帐号仅仅能是手机号或者邮箱等.我们还能够使用正則表達式来从一段字符串其中截取我们须要的字符串,比方说网页源代码中我们须要截取某些个图片地址等.总得来说.在iOS开发中正則表達式的作用有两点: 1. 检測给定的字符串是否符合业务逻辑 2. 从目标字符串中获取我们想要的特定字符串 怎样在OC中使用正則表達式? 1.利用NSPredicate

最全正則表達式汇总—想要的都有了

正则式太难学,并且easy忘记 ,西西是看过非常多次.都是一会就所有不记得了滴.非常多不太懂正则的朋友.在遇到须要用正则校验数据时,往往是在网上去找非常久.结果找来的还是不非常符合要求. 所以我近期把开发中经常使用的一些正則表達式整理了一下.在这里分享一下. 给自己留个底,也给朋友们做个參考. 一.校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^\d{n}$ 3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和非零开头的数字:^(0|[1-9][

JAVA学习第六十五课 — 正則表達式

正則表達式:主要应用于操作字符串.通过一些特定的符号来体现 举例: QQ号的校验 6~9位.0不得开头.必须是数字 String类中有matches方法 matches(String regex) 告知此字符串是否匹配给定的正則表達式. regex,就是给定的正則表達式 public static void checkQQ() { //第一位是数字1-9,第二位以后是0-9,除去第一位数剩下数字位数范围是5到8位 String regex = "[1-9][0-9]{5,8}";//正

正則表達式

一.概述 正則表達式是一种能够用于模式匹配和替换的强有力的工具.其作用例如以下: (1)測试字符串的某个模式.比如,能够对一个输入字符串进行測试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式.这称为数据有效性验证. (2)替换文本.能够在文档中使用一个正則表達式来标识特定文字,然后能够所有将其删除,或者替换为别的文字: (3)依据模式匹配从字符串中提取一个子字符串. 能够用来在文本或输入字段中查找特定文字. 二.匹配字符 字符 解释说明 \ 将下一字符标记为特殊字符.文本.反向引用或

JavaScript正則表達式知识汇总

Js 正則表達式知识汇总 正則表達式: 1.什么是RegExp?RegExp是正則表達式的缩写.RegExp 对象用于规定在文本中检索的内容. 2.定义RegExp:var +变量名=new RegExp(); 3.RegExp 对象有 3 个方法: 1)test()检索字符串中的指定值,返回值是true或false. var p1=new Reg("e"); document.write(Reg.test("welcome to China!")); 2)exec

python进阶十_正則表達式(一)

近期状态一直不太好,至于原因.怎么说呢,不好说,总之就是纠结中覆盖着纠结.心思全然不在点上.希望能够借助Python的学习以及博客的撰写来调整回来,有的时候回头想一想.假设真的是我自己的问题呢,曾经我常常跟别人说,千万不要怀疑自己.由于非常清楚一旦连自己都变的不可信.那这个世界就太疯狂了,当一遍一遍的问我,如今连我自己都快怀疑自己了,我一遍一遍的说服别人,想不到如今居然须要自己去说服自己,何其的悲哀~ 一.正則表達式基础 1.基本概念 正則表達式是计算机科学的一个概念.正則表達式使用单个字符串来

Python——正則表達式(2)

本文译自官方文档:Regular Expression HOWTO 參考文章:Python--正則表達式(1) 全文下载 :Python正則表達式基础 ====================================================================================== 3.使用正則表達式 如今.我们已经学习了一些简单的正則表達式,但我们应该怎么在Python中使用它们呢?re模块提供了一个连接正則表達式引擎的接口,同意你将RE编译成对象并利

JavaScript使用正則表達式

2.0 简单介绍 正則表達式是能够用来查找与给定模式匹配的文本的搜索模式.比如,在上一章中,我们在一个较长的字符串中查找子字符串Cookbook: var testValue = "This is the Cookbook's test string"; var subsValue = "Cookbook"; var iValue = testValue.indexOf(subsValue); //返回值12.即子字符串的索引 这段代码有效.由于我们要查找一个严格的