一、说明
使用正则表达式 需要包含名字空间using System.Text.RegularExpressions;
.Net使用的是传统型NFA引擎,.NET正则表达式流派概述
分类 |
举例 |
字符缩略表示法 |
\a [\b] \e \f \n \r \t \v\octal \x## \u#### \cchar |
字符组及相关 |
字符组:[…] [^…] 几乎任何字符:.(点号) 字符组缩略表示法:\w表达字母 ;\d表示数字;\W表示非字母;\D表示非数字 Unicode属性和区块:\p{Prop} |
锚点及其它零长度断言 |
行/字符串其实位置:^ \A 行/字符串结束位置:$ \z \Z 当前匹配的起始位置:\G 单词分节符:\b \B 环视结构:(?=…) 顺序环视;(?!...)顺序否定环视;(?<=…) 逆序环视;(?<!...) 逆序否定环视 |
注释及模式修饰符 |
模式修饰符:(?mods-mods) 容许出现的模式:x s m I n 模式修饰范围:(?mods-mods:…) 注释:(?#...) |
分组及捕获 |
捕获型括号:(…) \1 \2 对称分组:(?<name-name>…) 命令捕获及回溯:(?<name>…) \k<name> 近分组的括号:(?:…) 固化分组:(?>…) 多选结构:| 匹配优先量词:*(出现任意次,包括0次);+(至少出现一次);?(至多出现1次,即0次或1次);{n}(必须出现n次);{n,}(至少出现n次);{x,y}(至少出现x次,至多出现y次) 忽略优先量词:*? +? ?? {n}? {n,}? {x,y}? 条件判断:(?if then | else) ----if可以是环视、(num)或(name) |
.Net的匹配模式和正则表达式模式
RegexOptions选项 |
(?mode) |
说明 |
.Singleline |
s |
点号能够匹配任何字符,包括换行符 |
.Multiline |
m |
扩展^和$的匹配,使之可以匹配内部换行符 |
.IgnorePatternWhitespace |
x |
设置宽松排列和注释模式 |
IgnoreCase |
i |
进行不却分大小写的匹配 |
.ExplicitCapture |
n |
关闭(…)的捕获功能,只有(?<name>)能够捕获 |
.ECMAScript |
|
限制\w、\s和\d只对ASCII字符有效 |
.RightToLeft |
|
从字符串末尾开始向开头进行匹配 |
.Compiled |
|
进行编译,可以提升匹配速度,但是占用跟多内存资源 |
二、Replace函数
string value=”<item>SCUT华工计算机computer</item>大学<nodes> &%*Ghksadf</item>”;
string newValue = Regex.Replace(value, "<[^>]*>|</[^>]*>", "");
注:上面正则表达式目的是去掉所有<item></item>等标签,这在提取网页内容时候经常用到,并且上面匹配中<[^>]*>表示匹配从<开始并且最近的一个>,中间可以有任意个字符,|符号表示或,就是去掉”<任意字符>”及”</任意字符>”这样的标签。
三、Match函数
在输入字符串中搜索正则表达式的匹配项,并将精确结果作为单个 Match 对象返回。
重载列表:
(1) 在指定的输入字符串中搜索 Regex 构造函数中指定的正则表达式匹配项。
[C#] public Match Match(string);
(2) 从指定的输入字符串起始位置开始在输入字符串中搜索正则表达式匹配项。
[C#] public Match Match(string, int);
(3) 在指定的输入字符串中搜索 pattern 参数中提供的正则表达式的匹配项。
[C#] public static Match Match(string, string);
(4) 从指定的输入字符串起始位置开始在输入字符串中搜索具有指定输入字符串长度的正则表达式匹配项。
[C#] public Match Match(string, int, int);
(5) 在输入字符串中搜索 pattern 参数中提供的正则表达式的匹配项(匹配选项在 options 参数中提供)。
[C#] public static Match Match(string, string, RegexOptions);
【例一】取出网页中的Title属性
Match TitleMatch = Regex.Match(fileContents, "<title>([^<]*)</title>", RegexOptions.IgnoreCase | RegexOptions.Multiline );
filetitle = TitleMatch.Groups[1].Value;
注意红色的1, Regex.Match方法得到的Groups的索引是从1开始的,而不是从0开始的。
【例二】
string no=”<td colspan=”2”>华工计算机\t\t\n学院\t\t\n\n计算机科学与技术\t</td>”;
Match matchTmp;
matchTmp = Regex.Match(no, "<td colspan=\"2\">.*?</td>",RegexOptions.Singleline);
注:
RegexOptions.Singleline:指定单行模式。更改点 (.) 的含义,使它与每一个字符匹配(而不是与除 \n 之外的每个字符匹配)。 这是MSDN上面的解释。在正则表达式中"."是与"\n"之外的所有字符匹配的。当使用Singleline的时候,在使用"."的情况下会实现跨行匹配,在使用Multiline的时候不会实现跨行匹配;
RegexOptions.Multiline:多行模式。更改 ^ 和 $ 的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配(MSDN)。 在正则表达式中,"^"和 "$"表示匹配文本的开头的结束,但是在Multiline的情况下是在任意一行的行首和行尾匹配。
【例三】
StringBuilder input = new StringBuilder();
input.AppendLine("These is the first test line");
input.AppendLine("These is the second test line");
string pattern2 = @"ne.*";
MatchCollection matchCol = Regex.Matches(input.ToString(), pattern2,RegexOptions.Singleline);
foreach (Match item in matchCol)
{
Console.WriteLine("结果:{0}",item.Value);
}
结果:在是Singleline的情况下,匹配的结果是ne These is the second test line;在不是Singleline的情况下,匹配的结果是ne
【例四】
Match tmp = Regex.Match(mt.Value, "(src|data-src)=(\")?(.*?)(\"|\\s|$)",
RegexOptions.IgnoreCase);//再次匹配,获取图片链接
string res = tmp.Groups[3].Value;
说明:上面的语句中res的值为第三个括号中匹配的结果