正则表达式 关于?!和?

beysion 2009-09-03 06:46:28
(?! 子表达式)
(零宽度负预测先行断言。) 仅当子表达式不在此位置的右侧匹配时才继续匹配。例如,\b(?!un)\w+\b 与不以 un 开头的单词匹配。
(?<! 子表达式)
(零宽度负回顾后发断言。) 仅当子表达式不在此位置的左侧匹配时才继续匹配。

我想匹配不以0开头的数字
 Regex r = new Regex(@"^(?!0)\d+$");
string s = "0519554";
Match m = r.Match(s);
Console.WriteLine(m.Value);

上面这段效果是可以的

 Regex r = new Regex(@"^(?<!0)\d+$");
string s = "0519554";
Match m = r.Match(s);
Console.WriteLine(m.Value);

为什么上面的不行呢,?<!它不是说不在此位置的左侧嘛,0在此位置的左侧啊
这两个有什么区别啊?
...全文
215 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
一品梅 2009-09-03
  • 打赏
  • 举报
回复
记住,这个是零宽度
一品梅 2009-09-03
  • 打赏
  • 举报
回复
Regex r = new Regex(@"^(?<!0)\d+$");
string s = "0519554";
Match m = r.Match(s);
Console.WriteLine(m.Value);
=================================
0519554左边是没有零啊.找最大匹配字段.

Regex r = new Regex(@"^(?!0)\d+$");
string s = "0519554";
Match m = r.Match(s);
Console.WriteLine(m.Value);
===============================
是对的.
wuyq11 2009-09-03
  • 打赏
  • 举报
回复
断言此位置的前面不能匹配表达式exp
(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。
(?<=pattern):零宽度正回顾后发断言。匹配处于“匹配pattern的字符串”后面的字符串
(?<!pattern) :零宽度负回顾后发断言。匹配不处于“匹配pattern的字符串”后面的字符串(?>pattern):非回溯子表达式

十八道胡同 2009-09-03
  • 打赏
  • 举报
回复
零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。

同理,我们可以用(?<!exp),零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。

请详细分析表达式(?<=<(\w+)>).*(?=<\/\1>),这个表达式最能表现零宽断言的真正用途。
一个更复杂的例子:(?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单HTML标签内里的内容。(<?(\w+)>)指定了这样的前缀:被尖括号括起来的单词(比如可能是<b>),然后是.*(任意的字符串),最后是一个后缀(?=<\/\1>)。注意后缀里的\/,它用到了前面提过的字符转义;\1则是一个反向引用,引用的正是捕获的第一组,前面的(\w+)匹配的内容,这样如果前缀实际上是<b>的话,后缀就是</b>了。整个表达式匹配的是<b>和</b>之间的内容(再次提醒,不包括前缀和后缀本身)。
十八道胡同 2009-09-03
  • 打赏
  • 举报
回复
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置


看看这个

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧