在C#中,要使用正则表达式类,请在源文件开头处添加以下语句:
using System.Text.RegularExpressions;
可参考微软文档 :.NET 正则表达式
一、IsMatch(Input,patter[,options]) 否则匹配
如果表达式在字符串中匹配,返回布尔值。
if (Regex.IsMatch("a.b.c.d", @"(w).(w)", RegexOptions.IgnoreCase)) Console.Write("匹配成功");
正则表达式选项:RegexOptions
有如下选项
RegexOptions枚举值 |
内联标志 |
简单说明 |
ExplicitCapture |
n |
只有定义了命名或编号的组才捕获 |
IgnoreCase |
i |
不区分大小写 |
IgnorePatternWhitespace |
x |
消除模式中的非转义空白并启用由 # 标记的注释。 |
MultiLine |
m |
多行模式,其原理是修改了^和$的含义 |
SingleLine |
s |
单行模式,和MultiLine相对应 |
内联标志
相对于用RegexOptions在new Regex时定义Regex表达式的全局选项来说,内联标志可以更小粒度(以组为单位)的定义匹配选项,从而更方便表达我们的思想。
A(?i)bw+ 匹配“ABA Able Act”中的“ABA”和“Able”
二、Match(Input,patter[,options]) 单个匹配
如果在输入字符串中发现匹配,则返回匹配对象。(返回单个匹配对象)
Match m = Regex.Match("a.b.c.d", @"(w).(w)"); if (m.Success) Console.Write("Match=" + m.Value + " pos:" + m.Index);
//Match=a.b pos:0
三、Matches(Input,patter[,options]) 多个匹配
如果在输入字符串中发现全部匹配,则返回匹配集合对象。(返回多个匹配对象)
注意:匹配是不能重叠的,如果有重叠,在默认情况下,就选择最长的匹配(除非元字符后加问号)。
Regex的Match()或Matches()=>Match匹配(MatchCollection)=>Group 组(GroupCollection子模式)=>Capture捕获(CaptureCollection)
MatchCollection mc = Regex.Matches("a.b.c.d", @"(w).(w)"); for (int i = 0; i < mc.Count; i++) { Match match = mc[i]; Console.WriteLine("Match=" + match.Value + " :" + i); for (int j = 0; j < match.Groups.Count; j++) { Group group = match.Groups[j]; Console.WriteLine("--Group =" + group.Value + " :" + j); for (int k = 0; k < group.Captures.Count; k++) { Console.WriteLine("------Captures =" + group.Captures[k].Value + " :" + k); } } }
结果如下:
Match=a.b :0
----Group =a.b :0
--------Captures =a.b :0
----Group =a :1
--------Captures =a :0
----Group =b :2
--------Captures =b :0
Match=c.d :1
----Group =c.d :0
--------Captures =c.d :0
----Group =c :1
--------Captures =c :0
----Group =d :2
--------Captures =d :0
返回匹配成功后的第一个子模式的值:
var mc = Regex.Matches(Server.UrlDecode(client.ResponseHeaders["Content-Disposition"]), @"filename=(.+)"); string filename = mc[0].Groups[1].Value;
四、Replace(Input,patter,replacement或evaluator [,options]) 替换
用给定的Replacement替换input中的匹配。
Console.WriteLine(Regex.Replace("this test*", "[^a-zA-Z]", "()")); //this()test() Console.WriteLine(Regex.Replace("sevenyear", @"w+", m => { return m.Value.ToUpper(); }) ); //SEVENYEAR
五、Split(Input,patter[,options]) 拆分
在由模式定义的位置拆分input,返回string[]
string[] s = Regex.Split("first-second-thrid", "-"); for (int i = 0; i < s.Length; i++) { Console.WriteLine(s[i]); }
//first
//second
//thrid
拆分字符串举例:等长度分割字符串
1、每4个长度进行分割
var temp = Regex.Split("1234abcdef", @"(?<=G.{4})(?!$)"); temp.ToList().ForEach(t => Console.WriteLine(t));
//1234
//abcd
//ef
2、提取单词
var temp = Regex.Split("1234 abcd efa", @"(?<=S+s+)"); temp.ToList().ForEach(t => Console.WriteLine(t));
//1234
//abcd
//ef
3、每两个单词进行分割
var temp = Regex.Split("1234,abcd,12345,abcd,ab", @"(?<=G(?:w+[,,]){2})"); temp.ToList().ForEach(t => Console.WriteLine(t));
//1234,abcd,
//12345,abcd,
//ab
六、实例化Regex类
Regex exp= new Regex(@"w.w", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); MatchCollection mc = exp.Matches("a.b.c.d");