网上有一篇文章写的很好。请参见 正则表达式之环视 。现将自己的理解记录下来。
环视(lookaround)可以理解为限定条件。即字符串中,某个字符左边或右边能出现什么,不能出现什么。只是一个限定。从英文lookaround字面理解,因为英文是二维的,可以理解为看看左边和右边的情况。再匹配。
1、正则中开启环视
用小括号,?来开启一个环视。
表达式 | 说明 |
(?<=Expression) | 逆序肯定环视,表示所在位置左侧能够匹配Expression |
(?<!Expression) | 逆序否定环视,表示所在位置左侧不能匹配Expression |
(?=Expression) | 顺序肯定环视,表示所在位置右侧能够匹配Expression |
(?!Expression) | 顺序否定环视,表示所在位置右侧不能匹配Expression |
2、代码理解
例子1:字符右边限定 (顺序环视)
#region 环视 匹配除<p>或</p>之外的其余标签。 string str = "aa<p>one</p>bb<div>two</div>cc"; //开启一个顺序否定环视。 "<"字符右边不能出现"/?p)"即"p"和"/p"。 MatchCollection m = Regex.Matches(str, @"<(?!/?p)[^>]+>"); for (int i = 0; i < m.Count; i++) { MessageBox.Show(m[i].Value); //结果<div>和</div> } #endregion
例子2:字符左右边同时限定(逆序和顺序环视)
#region string str = "aa<p>one</p>bb<div>two</div>cc"; MatchCollection m = Regex.Matches(str, @"(?<=<div>)[^<]+(?=</div>)"); for (int i = 0; i < m.Count; i++) { MessageBox.Show(m[i].Value); //结果two } #endregion
例子3:数字格式化成用“,”的货币格式。