正则表达式,几个零宽断言表达式的区别

问题描述

如题(?=子表达式)和(?<=子表达式)区别?(?!子表达式)和(?<!子表达式)区别?看MSDN,除了名字外,从举例来看,这两组好像没区别他们原理上的区别是什么?

解决方案

解决方案二:

解决方案三:
(?<=(这里是左边的字符串))(这里是目标字窜)(?=(.这里是右边在字符串))里面的内容都是只参与匹配不参与显示一个是用在目标字窜左边的一个是用到右边的比如匹配<a>test</a>只要test(?<=(<a>))(.*?)(?=(</a>))而你如果写成(?<=(<a>))(.*?)(?<=(</a>))后面那么结果是test</a>因为(?<=)表示里面的</a>不再是test的后缀而是后面的前缀而你写成(?=(<a>))(.*?)(?=(</a>))那么结果是<a>test同理(?!)同理不过那个是左边的那个是右边的不清楚了很少用到非匹配
解决方案四:
引用2楼crystal_lz的回复:

(?<=(这里是左边的字符串))(这里是目标字窜)(?=(.这里是右边在字符串))里面的内容都是只参与匹配不参与显示一个是用在目标字窜左边的一个是用到右边的比如匹配<a>test</a>只要test(?<=(<a>))(.*?)(?=(</a>))而你如果写成(?<=(<a>))(.*?)(?<=(</a>))后面那么结果是test</a>因为(?<=)表示里面的</a>不再是test的后缀而是后面的前缀而你写成(?=(<a>))(.*?)(?=(</a>))那么结果是<a>test同理(?!)同理不过那个是左边的那个是右边的不清楚了很少用到非匹配

有左右之说,可是MSDN上有例子(?!子表达式)零宽度负预测先行断言b(?!un)w+b(?<!子表达式)零宽度负回顾后发断言(?<!19)d{2}b都在左边的,不知道这个怎么解释
解决方案五:
引用1楼starfd的回复:也看了几遍了,没总结出规律来
解决方案六:
引用3楼From_TaiWan的回复:

Quote: 引用2楼crystal_lz的回复:
(?<=(这里是左边的字符串))(这里是目标字窜)(?=(.这里是右边在字符串))里面的内容都是只参与匹配不参与显示一个是用在目标字窜左边的一个是用到右边的比如匹配<a>test</a>只要test(?<=(<a>))(.*?)(?=(</a>))而你如果写成(?<=(<a>))(.*?)(?<=(</a>))后面那么结果是test</a>因为(?<=)表示里面的</a>不再是test的后缀而是后面的前缀而你写成(?=(<a>))(.*?)(?=(</a>))那么结果是<a>test同理(?!)同理不过那个是左边的那个是右边的不清楚了很少用到非匹配

有左右之说,可是MSDN上有例子(?!子表达式)零宽度负预测先行断言b(?!un)w+b(?<!子表达式)零宽度负回顾后发断言(?<!19)d{2}b都在左边的,不知道这个怎么解释

开头不是qq后缀不是net的域名(?!左边)(?<!右边)
解决方案七:
也就是先行断言(左)后行断言(右)我记得还有正向预查还有反向预查这两个词汇来着反正我都理解为一左一右
解决方案八:
零宽断言地球人,是不是觉得这些术语名称太复杂,太难记了?我也有同感。知道有这么一种东西就行了,它叫什么,随它去吧!人若无名,便可专心练剑;物若无名,便可随意取舍……接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。最好还是拿例子来说明吧:断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如bw+(?=ingb),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'msingingwhileyou'redancing.时,它会匹配sing和danc。(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=bre)w+b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找readingabook时,它匹配ading。假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=d)d{3})+b,用它对1234567890进行查找时结果是234567890。下面这个例子同时使用了这两种断言:(?<=s)d+(?=s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)。这段说明貌似挺清楚的了啊,还有例子,然后感叹号的就是代表非而已
解决方案九:
谢谢楼上几位现在有个例子,百思不得其解,也表明=和<=有区别用<=foreach(MatchminRegex.Matches("abcdeAcf",@"w?(?<=c)",RegexOptions.None)){Response.Write(m.Value+"<br/>");}

输出:cc用=foreach(MatchminRegex.Matches("abcdeAcf",@"w?(?=c)",RegexOptions.None)){Response.Write(m.Value+"<br/>");}

输出:bA
解决方案十:
再顶一次,有没有碰到过这种情况的
解决方案十一:
引用9楼From_TaiWan的回复:

再顶一次,有没有碰到过这种情况的

你的字符串为“空字符a空字符b空字符c空字符d空字符e空字符A空字符c空字符f空字符”然后说明:(?<=前缀<只参与匹配不显示>)目标字符串(?=后缀<只参与匹配不显示>)你的那个第二种情况不用说了匹配结果为两个b(c)A(c)满足w?(紧接着一个不显示的c)括号里面的不显示只参与匹配第一种情况你一共有四个输出结果c空字符(cd之间)c空字符(cA之间)你的正则【w?(?<=c<空字符前缀>)空字符】意思就是【一个字符(一个只参与匹配不参与显示的c<空字符前缀>)空字符】【一个可以出现可以不出现的字符中间一个不显示的c空字符】因为上面我说了(?<=XXX)是作为前缀使用的而你正则后面没有指定字符那么那就用空字符作为前缀就像我上面列出来的说明一样开始匹配匹配a只满足w?然后需要一个空字符的前缀ca!=c=>不满足匹配b只满足w?然后需要一个空字符的前缀cb!=c=>不满足匹配c满足w?然后需要一个空字符的前缀cc=c=>满足注意上面你的原始字符串之间都有空字符只是不满足条件就没有列出来(正则会把字符两遍认为有一个空字符)然后原始字符串c后面的一个空字符满足你正则里面的空字符并且前面是一个不需要显示的c而再前面是w?(?表示可以不出现)所以满足条件【正则从右往左看匹配容易理解】后面同理======以上言论纯属个人猜测瞎比比
解决方案十二:

解决方案十三:
哈哈哈哈撸码撸码

时间: 2024-11-03 14:22:21

正则表达式,几个零宽断言表达式的区别的相关文章

正则表达式-【已解决】正则 零宽断言 匹配一个单词后的第一个数字

问题描述 [已解决]正则 零宽断言 匹配一个单词后的第一个数字 比如 [CM][bt][02][03] 我想匹配 02 我的正则是这样写的: i)(?<=bCMb(D*)?)d+(?=D) 但无法匹配成功,请问该怎样改呢? 感谢各位! 正则本身没错...错的是 PCRE 8.34–8.35 UTF-8 does not support variable repetition inside lookbehind or alternatives of different lengths inside

正则表达式零宽断言详解_正则表达式

正则表达式零宽断言: 零宽断言是正则表达式中的难点,所以本章节重点从匹配原理方面进行一下分析.零宽断言还有其他的名称,例如"环视"或者"预搜索"等等,不过这些都不是我们关注的重点. 一.基本概念: 零宽断言正如它的名字一样,是一种零宽度的匹配,它匹配到的内容不会保存到匹配结果中去,最终匹配结果只是一个位置而已. 作用是给指定位置添加一个限定条件,用来规定此位置之前或者之后的字符必须满足限定条件才能使正则中的字表达式匹配成功. 注意:这里所说的子表达式并非只有用小括号

正则表达式 零宽断言

问题描述 学习正则表达式零宽断言有点晕,看到这么一段  零宽度正预测先行断言      (?=exp) 匹配exp前面的位置例:[a-z]*(?=ing) 可以匹配 cooking 和 singing 中的 cook 与 sing .注意:先行断言的执行步骤是这样的先从要匹配的字符串中的最右端找到第一个 ing (也就是先行断言中的表达式)然后 再匹配其前面的表达式,若无法匹配则继续查找第二个 ing 再匹配第二个 ing 前面的字符串,若能匹配则匹配,符合正则的贪婪性.  这个是可以看懂的,但

正则表达式零宽断言详解

正则表达式零宽断言: 零宽断言是正则表达式中的难点,所以本章节重点从匹配原理方面进行一下分析.零宽断言还有其他的名称,例如"环视"或者"预搜索"等等,不过这些都不是我们关注的重点. 一.基本概念: 零宽断言正如它的名字一样,是一种零宽度的匹配,它匹配到的内容不会保存到匹配结果中去,最终匹配结果只是一个位置而已. 作用是给指定位置添加一个限定条件,用来规定此位置之前或者之后的字符必须满足限定条件才能使正则中的字表达式匹配成功. 注意:这里所说的子表达式并非只有用小括号

eclipse使用正则表达式(零宽断言)能查找,但不能替换,是为什么

问题描述 eclipse使用正则表达式(零宽断言)能查找,但不能替换,是为什么 5C 环境:eclipse版本luna之前的版本也试过,都不行.问题描述:如使用eclipse的查找/替换功能(ctrl+f)替换aaa.bbb.ccc中的bbb为ddd,查找正则表达式(第一个框):(?<=W|^)bbb(?=W)替换字符串为(第二个框):ddd结果是能准确的查找到bbb,但是点替换按钮时没有任何变化,不会变成aaa.ddd.ccc. 注意:不要给我说其它方法,由于场景不是现在描述的这么简单,各位大

关于 java 正则表达式 零宽断言 求回答

问题描述 关于 java 正则表达式 零宽断言 求回答 String= >Symantec bbSEPM码.a>display>"itemcca> regex= (?<=>).*?a> 问:能匹配到什么? 我认为是:Symantec bbSEPM码.a> "itemcca> 但结果是:Symantec bbSEPM码.a> "display>"itemcca> 不能理解!求大神!

正则表达式零宽断言问题

问题描述 正则表达式零宽断言问题 "bw*(?=q)w*b"怎么匹配abdlqdjfa是全部的?"bw*(?<=q)w*b"匹配也是得到全部!用的Regex Match Tracer!到底哪里错了啊!?百思不得其解!还有,""b(?=q)w*b""怎么匹配不了""abqdldjfa""?q不是在中间吗?""w*"",不是q的右边有字符吗?怎么

正则表达式之零宽断言实例详解【基于PHP】

本文实例讲述了正则表达式之零宽断言.分享给大家供大家参考,具体如下: 前言 之前我曾写了一篇关于正则表达式的文章(http://www.jb51.net/article/111359.htm) 在该文章中详细介绍了正则,但是关于零宽断言介绍却是很少提及到.现在将该内容补充一下.在本文中,主要解决如下问题: ① 什么是零宽断言,为什么要使用零宽断言 ② 怎样使用零宽断言 概念 零宽断言,大多地方这样定义它,用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像 \b ^ $ \<

使用JavaScript正则表达式校验非零正整数:(^[1-9]d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^+?[1-9][0-9]*$)

话不多说,请看实例代码: <!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title