一、组的分类
正则中的组有捕获组和非捕获组,而捕获组又分为普通的捕获组和命名捕获组,分别为 捕获组:(exp) 命名捕获组:(? <name> exp) 非捕获组:(?:exp) 二、组的作用 1、捕获组的作用 捕获组的作用是将正则表达式exp匹配到的内容保存到组里,供以后使用 比如这样一个字符串: <a href="http://bbs.csdn.net" title="床上等你"> CSDN </a> 我想得到网址,而它符合的规则是在 <a...> 标签内,那就可以这样做- C# code
- string test = " <a href=/"http://bbs.csdn.net/" title=/"床上等你/">CSDN</a> " ; Match m = Regex.Match(test, @" <a/s*href=""([^""]*)""[^>]*> " , RegexOptions.IgnoreCase); if (m.Success) MessageBox.Show(m.Groups[ 1 ].Value);
- C# code
- string test = " <a href=/"http://bbs.csdn.net/" title=/"床上等你/">CSDN</a> " ; Match m = Regex.Match(test, @" <a/s*href=""(?<url>[^""]*)""[^>]*> " , RegexOptions.IgnoreCase); if (m.Success) MessageBox.Show(m.Groups[ " url " ].Value);
- C# code
- MessageBox.Show(Regex.IsMatch( " 18:23:55 " , " ^(?:[01][0-9]|2[0-3])(?::[0-5][0-9]){2}$ " ).ToString());
- C# code
- string test = " <a href=/"http://bbs.csdn.net/" title=/"床上等你/">CSDN</a> " ; Match m = Regex.Match(test, @" <a/s*href=""(?<url>[^""]*)""/s*title=""([^""]*)""[^>]*>(?<text>[/s/S]*?)</a> " , RegexOptions.IgnoreCase); if (m.Success) { richTextBox1.Text += m.Groups[ 0 ].Value + " /n " ; // <a href=" http://bbs.csdn.net " title="床上等你">CSDN</a> richTextBox1.Text += m.Groups[ 1 ].Value + " /n " ; // 床上等你 richTextBox1.Text += m.Groups[ 2 ].Value + " /n " ; // http://bbs.csdn.net richTextBox1.Text += m.Groups[ " url " ].Value + " /n " ; // http://bbs.csdn.net richTextBox1.Text += m.Groups[ 3 ].Value + " /n " ; // CSDN richTextBox1.Text += m.Groups[ " text " ].Value + " /n " ; // CSDN }
- C# code
- string test = " <a href=/"http://bbs.csdn.net/" title=/"床上等你/">CSDN</a> " ; string result = Regex.Replace(test, @" <a/s*href=""([^""]*)""/s*title=""([^""]*)""[^>]*>(?<text>[/s/S]*?)</a> " , @" <a href=""$1"">${text}</a> " , RegexOptions.IgnoreCase); MessageBox.Show(result);
预搜索
(?=exp) (?!exp) (? <=exp) (? <!exp) 下面的说明很容易让人头晕,不看也罢,我将以另一种方式对它们的作用和用法进行说明 (?=exp) 匹配exp前面的位置 (? <=exp) 匹配exp后面的位置 (?!exp) 匹配后面跟的不是exp的位置 (? <!exp) 匹配前面不是exp的位置 有的资料上翻译为零宽度断言,我习惯于预搜索这种叫法,前两个为正向预搜索,后两个为反向预搜索,当然还有其它翻译,其实都是一个意思,知道就行,不必在意 这四种表达式,它们与非捕获的相同之处在于,并不将匹配到的结果保存到捕获组,不同之处在于,非捕获组匹配到的内容,虽然不保存到捕获组,但却是在结果$0实实在在存在的,而以上四种表达式所匹配到的内容,一般来说,是不存在$0内的,所以说它们匹配的结果是零宽度的 更好的理解方式,是把它们作为附加条件,而不是正则表达式的组成部分 为了更好的说明,先说一下“缝隙”的概念,“缝隙”是零宽度的,它只是字符串中的一个位置,而不是实际的字符,如字符串“ab”,在“a”前面,“a”和“b”中间,还有“b”后面,分别有一个“缝隙”,也就是整个字符串有三个“缝隙” (?=exp) 在所在“缝隙”的后面附加一个条件,也就是“缝隙”后面必须能够匹配exp的内容 (?!exp) 在所在“缝隙”的后面附加一个条件,也就是“缝隙”后面必须不能够匹配exp的内容 (? <=exp) 在所在“缝隙”的前面附加一个条件,也就是“缝隙”前面必须能够匹配exp的内容 (? <!exp) 在所在“缝隙”的前面附加一个条件,也就是“缝隙”前面必须不能够匹配exp的内容 举例说明如下: <[^> ]*> 表达式任意html标签 附加一个条件 <(?!img)[^> ]*> 这个就表示除 <img...> 标签外的所有标签,看下实际例子- C# code
- string test = " <p><a href=/"http://bbs.csdn.net/" title=/"床上等你/"><img src=/"http://bbs.csdn.net//logo.jpg/">CSDN</a></p> " ; MatchCollection mc = Regex.Matches(test, @" <(?!img)[^>]*> " , RegexOptions .IgnoreCase); foreach (Match m in mc) { richTextBox1.Text += m.Value + " /n " ; }
- C# code
- string test = " <p><a href=/"http://bbs.csdn.net/" title=/"床上等你/"><img src=/"http://bbs.csdn.net//logo.jpg/">CSDN</a></p> " ; MatchCollection mc = Regex.Matches(test, @" <(?=img)[^>]*> " , RegexOptions.IgnoreCase); foreach (Match m in mc) { MessageBox.Show(m.Value); }
- C# code
- string test = " <p><a href=/"http://bbs.csdn.net/" title=/"床上等你/"><img src=/"http://bbs.csdn.net//logo.jpg/">CSDN</a></p><img src=/"http://bbs.csdn.net//home.jpg/"> " ; MatchCollection mc = Regex.Matches(test, @" (?<=<a[^>]*>)<img[^>]*> " , RegexOptions.IgnoreCase); foreach (Match m in mc) { MessageBox.Show(m.Value); }
- C# code
- string test = " <p><a href=/"http://bbs.csdn.net/" title=/"床上等你/"><img src=/"http://bbs.csdn.net//logo.jpg/">CSDN</a></p><img src=/"http://bbs.csdn.net//home.jpg/"> " ; MatchCollection mc = Regex.Matches(test, @" (?<!<a[^>]*>)<img[^>]*> " , RegexOptions.IgnoreCase); foreach (Match m in mc) { MessageBox.Show(m.Value); }