问题描述
如题(?=子表达式)和(?<=子表达式)区别?(?!子表达式)和(?<!子表达式)区别?看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?(?表示可以不出现)所以满足条件【正则从右往左看匹配容易理解】后面同理======以上言论纯属个人猜测瞎比比
解决方案十二:
解决方案十三:
哈哈哈哈撸码撸码