正则表达式中?:的用法疑惑 用表达式(?:ab)([a-z]*?)(?=df)来匹配77abcddf88,为何会得到:abcd。目的是不包含ab,应该得到cd才是啊。另:改成(?:ab)([a-z]*?)(?:df)为何匹配到abcddf??:与?=有何区别?感觉都是表示以指定字符开始,但不缓存当前括号的内容。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 (?<=ab)([a-z]*?)(?=df) 这样才配套 ?<=这个只C#里才有吧?能用通用的最好。 另外用:(?=ab)([a-z]*?)(?=df)这个为什么也不行呢? 另外用:(?=ab)([a-z]*?)(?=df)这个为什么也不行呢?--------------------------(?=Exp)是给所在位置的右侧附加条件,如果是给所在位置左侧附加条件用(?<=Exp),即一楼所写正则 还是我讲讲吧(?:ab)([a-z]*?)(?=df)?: 的确是非捕获组,但其含义是 不会在组中捕获 但会在匹配结果中出现比如你这个正则,group[1]的值会是 cd如果(ab)这样 group[1]的值是ab但这两个匹配的结果是一样的 都是abcd?=正声明,出现在右边即不被组捕获也不被结果捕获?<=反向正声明 在左边 其他一样 (另:我自打学正则就没听说只有c#有他) ?<=在JS中测试会提示语法错误,另外很多专讲正则的资料也没提到它,当然MSDN例外。VB语法中还没试过。 (?=ab)([a-z]*?)(?=df)(?=ab)是给所在位置的右侧附加条件,这个右侧指的是表达式哪个位置呢?如果是?=的右侧,那么也自然在([a-z]*?)的左侧了。这里一直都没明白。谢谢。 这是一个比较抽象的概念,谈到相对位置,前或后,左或右,那就一定要有一个参照物的,这里所说的所在位置的左侧或右侧是对参照物而言的,并不是(?<=Exp)或(?=Exp)本身,我们可以把它所参照的位置理解为一个零宽度的位置或“缝隙”,下面举例说明吧先从简单的开始,有两个字符串str1 = "a123b"str2 = "a123c123b"有一个正则表达式:(?<=a)\d+(?=b)这里的\d+是明确的,就是数字,它可以做为参照物,而(?<=a)在“缝隙”处加了一个限定条件,在它的左侧为a,这里的“缝隙”指的就是(?<=a)和\d+之间的“缝隙”,由(?=b)加了一个限定条件,在它的右侧为b,这里的“缝隙”指的就是\d+和(?=b)之间的“缝隙”,用它来匹配str1的结果是匹配成功,而匹配str2的结果是不成功,因为str2两组数字的两侧都不同时满足这两个条件换成另一个正则表达式:(?=a)\d+(?<=b)我们根本不用拿任何例子去试,从正则表达式本身就可以断定它匹配不到任何内容,因为它本身就是自相矛盾的,(?=a)附加的条件是在“缝隙”的右侧是a,而很明显这个式子里“缝隙”的右侧一定是数字才能匹配成功,(?<=b)同理或者把以上的\d+直接写为123可能会更有组于你的理解再来说下(?=ab)([a-z]*?)(?=df)这个表达式,如果用它来匹配77abcddf88字符串,也是可以匹配成功的,但匹配的结果是abcd,因为(?=ab)要求它所参照的“缝隙”右侧为ab,这里只有77和ab之间的“缝隙”才满足条件,而(?=df)要求它所参照的“缝隙”右侧为df,这里只有cd和df之间的“缝隙”满足要求,所以匹配结果为abcd而(?<=ab)([a-z]*?)(?=df)这个表达式,(?<=ab)要求缝隙的左侧为ab,这里只有ab和cd之间的“缝隙”满足要求,(?=df)同上,所以匹配结果为cd lxcnn(过客) 正解。虽然正则用的很多,但对零宽度匹配一直没有很好的掌握,可能是因为这一部分是正则中各种语言差异最大的部分了 用 datagridview 绑定并更新的灵活性问题, 40分求助C#队列问题 菜鸟问题。。 DrawString有点怪 打印预览时 我写了一个类(class1.cs中) ,如何在窗体中使用这个类? 如何在datagrid中实现主表与子表的效果 那里出错了 一种类似树状的传销算法,求助~~~~~~~~~~~~~ 请问:在c#里,如何阻止改变窗体大小? CRYSTAL REPORT需要那些DLL,才能在用户那边使用? c#的winform如何来访问页面? 我的VS2003不能创建新项目了
--------------------------(?=Exp)是给所在位置的右侧附加条件,如果是给所在位置左侧附加条件用(?<=Exp),即一楼所写正则
(?:ab)([a-z]*?)(?=df)
?: 的确是非捕获组,但其含义是 不会在组中捕获 但会在匹配结果中出现
比如你这个正则,group[1]的值会是 cd
如果(ab)这样 group[1]的值是ab
但这两个匹配的结果是一样的 都是abcd
?=正声明,出现在右边即不被组捕获也不被结果捕获
?<=反向正声明 在左边 其他一样 (另:我自打学正则就没听说只有c#有他)
VB语法中还没试过。
str1 = "a123b"
str2 = "a123c123b"
有一个正则表达式:(?<=a)\d+(?=b)
这里的\d+是明确的,就是数字,它可以做为参照物,而(?<=a)在“缝隙”处加了一个限定条件,在它的左侧为a,这里的“缝隙”指的就是(?<=a)和\d+之间的“缝隙”,由(?=b)加了一个限定条件,在它的右侧为b,这里的“缝隙”指的就是\d+和(?=b)之间的“缝隙”,用它来匹配str1的结果是匹配成功,而匹配str2的结果是不成功,因为str2两组数字的两侧都不同时满足这两个条件换成另一个正则表达式:(?=a)\d+(?<=b)
我们根本不用拿任何例子去试,从正则表达式本身就可以断定它匹配不到任何内容,因为它本身就是自相矛盾的,(?=a)附加的条件是在“缝隙”的右侧是a,而很明显这个式子里“缝隙”的右侧一定是数字才能匹配成功,(?<=b)同理或者把以上的\d+直接写为123可能会更有组于你的理解
再来说下(?=ab)([a-z]*?)(?=df)这个表达式,如果用它来匹配77abcddf88字符串,也是可以匹配成功的,但匹配的结果是abcd,因为(?=ab)要求它所参照的“缝隙”右侧为ab,这里只有77和ab之间的“缝隙”才满足条件,而(?=df)要求它所参照的“缝隙”右侧为df,这里只有cd和df之间的“缝隙”满足要求,所以匹配结果为abcd
而(?<=ab)([a-z]*?)(?=df)这个表达式,(?<=ab)要求缝隙的左侧为ab,这里只有ab和cd之间的“缝隙”满足要求,(?=df)同上,所以匹配结果为cd
虽然正则用的很多,但对零宽度匹配一直没有很好的掌握,可能是因为这一部分是正则中各种语言差异最大的部分了