欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

正则表达式 不包含指定字符串 不包括 排除 有大用 有大大用

    ^((?!hede).)*$   不包含   hede 的字符串          # 这个有大用 有大大用


           


           


           

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


参考资料 
http://www.imkevinyang.com/2009/08/%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%89%BE%E5%87%BA%E4%B8%8D%E5%8C%85%E5%90%AB%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%9D%A1%E7%9B%AE.html 

正则基本知识 
http://xixian.iteye.com/blog/721147 

正则表达式中有前瞻(Lookahead)和后顾(Lookbehind)的概念,这两个术语非常形象的描述了正则引擎的匹配行为。需要注意一点,正则表达式中的前和后和我们一般理解的前后有点不同。一段文本,我们一般习惯把文本开头的方向称作“前面”,文本末尾方向称为“后面”。 
但是对于正则表达式引擎来说,因为它是从文本头部向尾部开始解析的(可以通过正则选项控制解析方向),因此对于文本尾部方向,称为“前”,因为这个时候,正则引擎还没走到那块,而对文本头部方向,则称为“后”,因为正则引擎已经走过了那一块地方。 

如下图所示: 

前瞻就是在正则表达式匹配到某个字符的时候,往“尚未解析过的文本”预先看一下,看是不是符合/不符合匹配模式。 

后顾,就是在正则引擎已经匹配过的文本看看是不是符合/不符合匹配模式。符合和不符合特定匹配模式我们又称为肯定式匹配和否定式匹配 

现在看它们的定义方法吧(零断言,不用管术语名称,翻译太拗口复杂了)
 
           
Java代码 复制代码 收藏代码                    
  1. //前瞻  

  2. (?=exp)真正有用的部分,在这个位置之前,之前的数据需要匹配exp  

  3. (?<=exp)真正有用的部分,在这个位置之后,之后的数据需要匹配exp  

  4. //后顾  

  5. (?!exp)真正有用的部分,在这个位置之前,之前的数据不匹配exp  

  6. (?<!exp)真正有用的部分,在这个位置之后,之后的数据不匹配exp  

  1. //前瞻                        
  2. (?=exp)真正有用的部分,在这个位置之前,之前的数据需要匹配exp
  3. (?<=exp)真正有用的部分,在这个位置之后,之后的数据需要匹配exp
  4. //后顾                        
  5. (?!exp)真正有用的部分,在这个位置之前,之前的数据不匹配exp
  6. (?<!exp)真正有用的部分,在这个位置之后,之后的数据不匹配exp


开始写不含特定字符的正则 

参考例子说明
 
           
Java代码 复制代码 收藏代码                    
  1.           

  2. String reg="^(?!.*(不合谐)).*$";//用到了前瞻  

  3.         System.out.println("不管信不信,反正现在很不合谐".matches(reg));//false不通过  

  4.         System.out.println("不管信不信,反正现在非常合谐".matches(reg));//true通过  

  5.         System.out.println("不合谐在某国是普遍存在的".matches(reg));//false不通过  


  1. String reg="^(?!.*(不合谐)).*$";//用到了前瞻                        
  2.                             System.out.println("不管信不信,反正现在很不合谐".matches(reg));//false不通过                        
  3.                             System.out.println("不管信不信,反正现在非常合谐".matches(reg));//true通过                        
  4.                             System.out.println("不合谐在某国是普遍存在的".matches(reg));//false不通过                        


上面就把含有特定字符的句子完全抹杀了,实现了完全和谐社会。。。。。 

上面例子是特定字符在任意位置出现都会匹配 
现在某国突然良心发现皇恩浩荡开放部分言论 
只想实现不以特定字符结尾的句子 
我们套用上面的例子,稍微改下
 
           
Java代码 复制代码 收藏代码                    
  1.           

  2. String reg="^.*(?<!(不合谐))$";//用到了后顾  

  3.         System.out.println("不管信不信,反正现在很不合谐".matches(reg));//false不通过  

  4.         System.out.println("不管信不信,反正现在非常合谐".matches(reg));//true通过  

  5.         System.out.println("不合谐在某国是普遍存在的".matches(reg));//true通过  


  1. String reg="^.*(?<!(不合谐))$";//用到了后顾                        
  2.                             System.out.println("不管信不信,反正现在很不合谐".matches(reg));//false不通过                        
  3.                             System.out.println("不管信不信,反正现在非常合谐".matches(reg));//true通过                        
  4.                             System.out.println("不合谐在某国是普遍存在的".matches(reg));//true通过                        


现在第三条数据这么不和谐的数据也通过 
人民可以说些话了,某国也可以辟谣了 
五毛们也有工作量了,也多少增加了GDP的发展吧 
------------------------------- 
以上数据纯属虚构,如有雷同,纯属巧合 
       



来自  https://blog.csdn.net/joe_007/article/details/44947325



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

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

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

^((?!hede).)*$

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

解释

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

image.png

  1. +--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+
  2. S = |e1| A |e2| B |e3| h |e4| e |e5| d |e6| e |e7| C |e8| D |e9|            
  3. +--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+---+--+
  4. 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"字符串,也就是包含了指定的字符串。

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

 

引自: http://www.vaikan.com/regular-expression-to-match-string-not-containing-a-word/

来自  https://blog.csdn.net/rainbow702/article/details/50518833


//确认关机
//"", "是的","","好的","需要","关机","自动关机"

//这里既不能包含不字,但是也要匹配其他的字符
String regular = "^(?!.*)^.*(|是的||好的|需要|关机|确定|自动关机).*$";

来自 https://blog.csdn.net/program008/article/details/74298820

正则表达式: 找出不含(排除)某个字符串的所有


Match string not containing string            

Given a list of strings (words or other characters), only return the strings that do not match.


           

以正则表达式 ^((?!badword).)*$ 搜索以下内容将会得到除1、4行以外的所有内容。此表达式对于log搜索比较有用。

badword可以替换为一组字符串,如(ECSdk|MOS),表达式^((?!(ECSdk|MOS)).)*$意为排除ECSdk和MOS 所在的行。
           

badword
test
one two
abadwords
           

three


           

参考:
           

https://www.regextester.com/15


来自  https://blog.csdn.net/lancewoo/article/details/80691843



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


点击打开链接            

 

使用否定式前瞻

正则表达式中有前瞻(Lookahead)和后顾(Lookbehind)的概念,这两个术语非常形象的描述了正则引擎的匹配行为。需要注意一点,正则表达式中的前和后和我们一般理解的前后有点不同。一段文本,我们一般习惯把文本开头的方向称作“前面”,文本末尾方向称为“后面”。但是对于正则表达式引擎来说,因为它是从文本头部向尾部开始解析的(可以通过正则选项控制解析方向),因此对于文本尾部方向,称为“前”,因为这个时候,正则引擎还没走到那块,而对文本头部方向,则称为“后”,因为正则引擎已经走过了那一块地方。如下图所示:

正向前瞻逆向前瞻            

所谓的前瞻就是在正则表达式匹配到某个字符的时候,往“尚未解析过的文本”预先看一下,看是不是符合/不符合匹配模式,而后顾,就是在正则引擎已经匹配过的文本看看是不是符合/不符合匹配模式。符合和不符合特定匹配模式我们又称为肯定式匹配和否定式匹配

现代高级正则表达式引擎一般都支持都支持前瞻,对于后顾支持并不是很广泛,因此我们这里采用否定式前瞻来实现我们的需求。

实现

测试数据:

  1. 2009-07-07 04:38:44 127.0.0.1 GET /robots.txt
  2. 2009-07-07 04:38:44 127.0.0.1 GET /posts/robotfile.txt
  3. 2009-07-08 04:38:44 127.0.0.1 GET /
           

例如上面这几条简单的日志条目,我们想实现两个目标:

1. 把8号的数据过滤掉

2. 把那些不包含robots.txt字符串的条目给找出来(只要Url中包含robots.txt的都给过滤掉)。

前瞻的语法是:

(?!匹配模式)
           

我们先来实现第一个目标——匹配不以特定字符串开头的条目

这里我们因为要排除一段连续的字符串,因此匹配模式非常简单,就是2009-07-08。实现如下:

^(?!2009-07-08).*?$
           

Expresso我们可以看到结果确实过滤掉8号的数据。

接下来,我们来实现第二个目标——排除包含特定字符串的条目

按照我们上面写法,我照葫芦画瓢了一下:

^.*?(?!robots\.txt).*?$
           

这段正则用大白话描述就是:开头任意字符,然后后面不要跟着robots.txt连续字符串,然后再跟着任意个字符,字符串结尾。

运行测试,结果发现:

image            

没有达到我们想要的效果。这是为什么呢?我们给上面的正则表达式加上两个捕获分组调试一下:

^(.*?)(?!robots\.txt)(.*?)$
           

测试结果:

image            

我们看到,第一个分组啥都没有匹配到,而第二个分组却匹配了整个字符串。再回过头来好好分析一下刚才那个正则表达式。实际上,当正则引擎解析到A区域的时候,就已经开始执行B区域的前瞻工作。这个时候发现当A区域为Null的时候匹配成功——.*本来就允许匹配空字符,前瞻条件又满足,A区域后面紧跟着的是“2009”字符串,而并不是robots。因此整个匹配过程成功匹配到所有条目。

image            

分析出原因之后我们对上述的正则进行修正,将.*?移入前瞻表达式,如下:

^(?!.*?robots).*$
           

测试结果:

image            

Bingo!


来自  https://blog.csdn.net/maqingli20/article/details/7317925


正则表达式匹配:包含且不包含


版权声明:转载请声明转自http://blog.csdn.net/thewindkee https://blog.csdn.net/thewindkee/article/details/52785763

参考:http://www.jb51.net/article/52491.htm            

           http://www.cnblogs.com/yirlin/archive/2006/04/12/373222.html            

例:包含admin且不包含abc。

^((?!abc).)*admin((?!abc).)*$            

查资料知道:


           

(?!pattern)	负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始

(?!abc) 的意思是 , 不匹配abc
           


           

那么((?!abc).)*  的意思就是匹配  不含abc的字符(?!abc) 跟 任意字符的组合,出现任何次            

((?!abc).)* 的结果就是 匹配了不包含abc的字符串

加上首尾  ^((?!abc).)*$ 表示匹配一行

效果如下

           


           


           

上面的可以看出((?!abc).)*表示匹配不包含abc的字符串, 现在想要匹配  不包含abc但包含admin  的字符串。

那么让 不包含abc的字符串出现在 admin 的两端?

试试:

^((?!abc).)*admin((?!abc).)*$


           

简单测试了下, 是可以的。


           

应该有更简洁的方法, 请留言告知~


           

请参考这篇文章:

http://blog.csdn.net/thewindkee/article/details/53886023            


来自 https://blog.csdn.net/thewindkee/article/details/52785763


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


经常我们会遇到想找出不包含某个字符串的文本,程序员最容易想到的是在正则表达式里使用,^(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).)*。

你可以理解,正则表达式((?!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+就表示了那些非素数的串,那么素数串就是除去这些非素数串,即是以上的正则表达式了。


来自  https://blog.csdn.net/MYsce/article/details/76546480


正则表达式匹配不包含某些字符串


正则表达式匹配不包含某些字符串:

^((?!hello).)*$   //如果包含hello字符串会被匹配处理


来自  https://blog.csdn.net/mjack520123/article/details/72235450


正则表达式匹配不包含某个字符串



来自  https://blog.csdn.net/symlljg/article/details/52451705


正则表达式判断不包含某个字符串


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q519364805/article/details/82289192

因为线上监控,监控小组提供了一个正则表达式来处理是否需要告警通知。

现有一批异常代码不需要告警,需要用正则去匹配不用提示的警告代码:通过百度得知

(?!pattern)

非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。

正则表示式的这种写法,可以满足只要包含某个特定支付串,不通过正则校验的功能


来自  https://blog.csdn.net/simle_yf_smile/article/details/82289192


正则表达式不以某字符串结尾


           


           



来自 https://blog.csdn.net/Lyq3413/article/details/50548633






https://blog.csdn.net/simle_yf_smile/article/details/82289192


普通分类: