(?=子表达式)和(?<=子表达式)区别?
(?!子表达式)和(?<!子表达式)区别?
看MSDN,除了名字外,从举例来看,这两组好像没区别
他们原理上的区别是什么?
12 个解决方案
#2
(?<=(这里是左边的字符串))(这里是目标字窜)(?=(.这里是右边在字符串))里面的内容都是只参与匹配 不参与显示 一个是用在目标字窜左边的 一个是用到右边的
比如匹配 <a>test</a> 只要test
(?<=(<a>))(.*?)(?=(</a>))
而你如果写成
(?<=(<a>))(.*?)(? <=(</a>)) 后面
那么结果是 test</a> 因为(?<=)表示 里面的</a>不再是test的后缀而是 后面的前缀
而你写成
(?=(<a>))(.*?)(?=(</a>))
那么结果是 <a>test 同理
(?!)同理 不过那个是左边的那个是右边的 不清楚了 很少用到非匹配
http://files.cnblogs.com/files/JimmyZhang/Regular-Expression-Tutorial.pdf
比如匹配 <a>test</a> 只要test
(?<=(<a>))(.*?)(?=(</a>))
而你如果写成
(?<=(<a>))(.*?)(? <=(</a>)) 后面
那么结果是 test</a> 因为(?<=)表示 里面的</a>不再是test的后缀而是 后面的前缀
而你写成
(?=(<a>))(.*?)(?=(</a>))
那么结果是 <a>test 同理
(?!)同理 不过那个是左边的那个是右边的 不清楚了 很少用到非匹配
http://files.cnblogs.com/files/JimmyZhang/Regular-Expression-Tutorial.pdf
#3
有左右之说,可是MSDN上有例子
(?! 子表达式 ) 零宽度负预测先行断言 \b(?!un)\w+\b
(?<! 子表达式 ) 零宽度负回顾后发断言 (?<!19)\d{2}\b
都在左边的,不知道这个怎么解释
(?! 子表达式 ) 零宽度负预测先行断言 \b(?!un)\w+\b
(?<! 子表达式 ) 零宽度负回顾后发断言 (?<!19)\d{2}\b
都在左边的,不知道这个怎么解释
#4
也看了几遍了,没总结出规律来
#5
开头不是 qq 后缀不是 net 的域名
(?!左边) (?<!右边)
#6
也就是 先行断言(左) 后行断言(右) 我记得还有 正向预查 还有 反向预查 这两个词汇来着 反正我都理解为 一左一右
#7
零宽断言
地球人,是不是觉得这些术语名称太复杂,太难记了?我也有同感。知道有这么一种东西就行了,它叫什么,随它去吧!人若无名,便可专心练剑;物若无名,便可随意取舍……
接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。最好还是拿例子来说明吧:
断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})+\b,用它对1234567890进行查找时结果是234567890。
下面这个例子同时使用了这两种断言:(?<=\s)\d+(?=\s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)。
这段说明貌似挺清楚的了啊,还有例子,然后感叹号的就是代表非而已
地球人,是不是觉得这些术语名称太复杂,太难记了?我也有同感。知道有这么一种东西就行了,它叫什么,随它去吧!人若无名,便可专心练剑;物若无名,便可随意取舍……
接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。最好还是拿例子来说明吧:
断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})+\b,用它对1234567890进行查找时结果是234567890。
下面这个例子同时使用了这两种断言:(?<=\s)\d+(?=\s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)。
这段说明貌似挺清楚的了啊,还有例子,然后感叹号的就是代表非而已
#8
谢谢楼上几位
现在有个例子,百思不得其解,也表明=和<=有区别
用<=
输出:
c
c
用=
输出:
b
A
现在有个例子,百思不得其解,也表明=和<=有区别
用<=
foreach (Match m in Regex.Matches("abcdeAcf", @"\w?(?<=c)", RegexOptions.None))
{
Response.Write(m.Value + "<br />");
}
输出:
c
c
用=
foreach (Match m in Regex.Matches("abcdeAcf", @"\w?(?=c)", RegexOptions.None))
{
Response.Write(m.Value + "<br />");
}
输出:
b
A
#9
再顶一次,有没有碰到过这种情况的
#10
再顶一次,有没有碰到过这种情况的
你的字符串为 “ 空字符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? 然后需要一个 空字符的前缀c a!=c => 不满足
匹配b只满足\w? 然后需要一个 空字符的前缀c b!=c => 不满足
匹配c满足\w? 然后需要一个 空字符的前缀c c=c => 满足
注意 上面你的原始字符串之间都有 空字符只是不满足条件 就没有列出来(正则会把字符两遍认为有一个 空字符)
然后原始字符串c后面的一个 空字符 满足你正则里面的 空字符 并且前面是一个不需要显示的c而再前面是\w?(?表示可以不出现) 所以满足条件【正则从右往左看匹配容易理解】
后面同理
===
===
以上言论纯属个人猜测瞎比比
#11
#12
哈哈哈哈撸码撸码
#1
#2
(?<=(这里是左边的字符串))(这里是目标字窜)(?=(.这里是右边在字符串))里面的内容都是只参与匹配 不参与显示 一个是用在目标字窜左边的 一个是用到右边的
比如匹配 <a>test</a> 只要test
(?<=(<a>))(.*?)(?=(</a>))
而你如果写成
(?<=(<a>))(.*?)(? <=(</a>)) 后面
那么结果是 test</a> 因为(?<=)表示 里面的</a>不再是test的后缀而是 后面的前缀
而你写成
(?=(<a>))(.*?)(?=(</a>))
那么结果是 <a>test 同理
(?!)同理 不过那个是左边的那个是右边的 不清楚了 很少用到非匹配
http://files.cnblogs.com/files/JimmyZhang/Regular-Expression-Tutorial.pdf
比如匹配 <a>test</a> 只要test
(?<=(<a>))(.*?)(?=(</a>))
而你如果写成
(?<=(<a>))(.*?)(? <=(</a>)) 后面
那么结果是 test</a> 因为(?<=)表示 里面的</a>不再是test的后缀而是 后面的前缀
而你写成
(?=(<a>))(.*?)(?=(</a>))
那么结果是 <a>test 同理
(?!)同理 不过那个是左边的那个是右边的 不清楚了 很少用到非匹配
http://files.cnblogs.com/files/JimmyZhang/Regular-Expression-Tutorial.pdf
#3
(?<=(这里是左边的字符串))(这里是目标字窜)(?=(.这里是右边在字符串))里面的内容都是只参与匹配 不参与显示 一个是用在目标字窜左边的 一个是用到右边的
比如匹配 <a>test</a> 只要test
(?<=(<a>))(.*?)(?=(</a>))
而你如果写成
(?<=(<a>))(.*?)(? <=(</a>)) 后面
那么结果是 test</a> 因为(?<=)表示 里面的</a>不再是test的后缀而是 后面的前缀
而你写成
(?=(<a>))(.*?)(?=(</a>))
那么结果是 <a>test 同理
(?!)同理 不过那个是左边的那个是右边的 不清楚了 很少用到非匹配
http://files.cnblogs.com/files/JimmyZhang/Regular-Expression-Tutorial.pdf
(?! 子表达式 ) 零宽度负预测先行断言 \b(?!un)\w+\b
(?<! 子表达式 ) 零宽度负回顾后发断言 (?<!19)\d{2}\b
都在左边的,不知道这个怎么解释
#4
deerchao.net/tutorials/regex/regex.htm
#5
有左右之说,可是MSDN上有例子
(?<=(这里是左边的字符串))(这里是目标字窜)(?=(.这里是右边在字符串))里面的内容都是只参与匹配 不参与显示 一个是用在目标字窜左边的 一个是用到右边的
比如匹配 <a>test</a> 只要test
(?<=(<a>))(.*?)(?=(</a>))
而你如果写成
(?<=(<a>))(.*?)(? <=(</a>)) 后面
那么结果是 test</a> 因为(?<=)表示 里面的</a>不再是test的后缀而是 后面的前缀
而你写成
(?=(<a>))(.*?)(?=(</a>))
那么结果是 <a>test 同理
(?!)同理 不过那个是左边的那个是右边的 不清楚了 很少用到非匹配
http://files.cnblogs.com/files/JimmyZhang/Regular-Expression-Tutorial.pdf
(?! 子表达式 ) 零宽度负预测先行断言 \b(?!un)\w+\b
(?<! 子表达式 ) 零宽度负回顾后发断言 (?<!19)\d{2}\b
都在左边的,不知道这个怎么解释
开头不是 qq 后缀不是 net 的域名
(?!左边) (?<!右边)
#6
也就是 先行断言(左) 后行断言(右) 我记得还有 正向预查 还有 反向预查 这两个词汇来着 反正我都理解为 一左一右
#7
零宽断言
地球人,是不是觉得这些术语名称太复杂,太难记了?我也有同感。知道有这么一种东西就行了,它叫什么,随它去吧!人若无名,便可专心练剑;物若无名,便可随意取舍……
接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。最好还是拿例子来说明吧:
断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})+\b,用它对1234567890进行查找时结果是234567890。
下面这个例子同时使用了这两种断言:(?<=\s)\d+(?=\s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)。
这段说明貌似挺清楚的了啊,还有例子,然后感叹号的就是代表非而已
地球人,是不是觉得这些术语名称太复杂,太难记了?我也有同感。知道有这么一种东西就行了,它叫什么,随它去吧!人若无名,便可专心练剑;物若无名,便可随意取舍……
接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。最好还是拿例子来说明吧:
断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了),你可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})+\b,用它对1234567890进行查找时结果是234567890。
下面这个例子同时使用了这两种断言:(?<=\s)\d+(?=\s)匹配以空白符间隔的数字(再次强调,不包括这些空白符)。
这段说明貌似挺清楚的了啊,还有例子,然后感叹号的就是代表非而已
#8
谢谢楼上几位
现在有个例子,百思不得其解,也表明=和<=有区别
用<=
输出:
c
c
用=
输出:
b
A
现在有个例子,百思不得其解,也表明=和<=有区别
用<=
foreach (Match m in Regex.Matches("abcdeAcf", @"\w?(?<=c)", RegexOptions.None))
{
Response.Write(m.Value + "<br />");
}
输出:
c
c
用=
foreach (Match m in Regex.Matches("abcdeAcf", @"\w?(?=c)", RegexOptions.None))
{
Response.Write(m.Value + "<br />");
}
输出:
b
A
#9
再顶一次,有没有碰到过这种情况的
#10
再顶一次,有没有碰到过这种情况的
你的字符串为 “ 空字符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? 然后需要一个 空字符的前缀c a!=c => 不满足
匹配b只满足\w? 然后需要一个 空字符的前缀c b!=c => 不满足
匹配c满足\w? 然后需要一个 空字符的前缀c c=c => 满足
注意 上面你的原始字符串之间都有 空字符只是不满足条件 就没有列出来(正则会把字符两遍认为有一个 空字符)
然后原始字符串c后面的一个 空字符 满足你正则里面的 空字符 并且前面是一个不需要显示的c而再前面是\w?(?表示可以不出现) 所以满足条件【正则从右往左看匹配容易理解】
后面同理
===
===
以上言论纯属个人猜测瞎比比
#11
#12
哈哈哈哈撸码撸码