正则表达式构造
正则表达式是正则表达式引擎尝试匹配输入文本的一种模式。 模式由一个或多个字符文本、运算符或构造组成。 关于正则表达式可以参考MSDN:http://msdn.microsoft.com/zh-cn/library/az24scfc(v=vs.110).aspx 字符组 形式一般为[...],匹配方括号中任意字符 namespace ConsoleApplication { class Program { static void Main(string[] args) { string pattern = @"[abc]"; string inputs = "ab"; Regex regex = new Regex(pattern); if (regex.IsMatch(inputs)) { Console.WriteLine(inputs + " matches " + pattern); } else { Console.WriteLine(inputs + " dose not match " + pattern); } } } }运行结果:ab matches [abc] [^...]匹配非方括号中字符的任意字符 运行结果:good matche [^abc] 连字符'-'表示范围,如[0123456789]等价于[0-9] 正则表达式提供常用的一些字符类: [d] = [0-9] [D] = [^0-9] [w] = [0-9a-zA-Z_] [W] = [^0-9a-zA-Z_] [s]匹配空白字符 [S]匹配非空白字符 点号可以匹配几乎所有的字符(点号不能匹配换行符)
量词(限定字符出现的次数) *之前的字符可以出现0次到无穷多次{0,} +之前的字符至少需要出现1次{1,} ?之前的字符多只能出现1次{0,1} 区间量词 {min,max}匹配上一个元素至少 min次,但不多于 max 次 {min,}匹配上一个元素至少 min 次 {number}匹配上一个元素恰好 number次 如果要规定一个字符串的出现次数,必须使用(),在括号内填写字符串,在闭括号之后添加量词 namespace ConsoleApplication { class Program { static void Main(string[] args) { string pattern = @"w{2}d+"; string inputs = "DF2"; Regex regex = new Regex(pattern); if (regex.IsMatch(inputs)) { Console.WriteLine(inputs + " matches " + pattern); } else { Console.WriteLine(inputs + " dose not match " + pattern); } } } }运行结果:DF2 matches w{2}d+
小括号的作用 1.多选结构,表示某个位置出现的字符串(…|…) namespace ConsoleApplication { class Program { static void Main(string[] args) { string pattern = @"(good|bad)day"; string inputs = "goodday"; Regex regex = new Regex(pattern); if (regex.IsMatch(inputs)) { Console.WriteLine(inputs + " matches " + pattern); } else { Console.WriteLine(inputs + " dose not match " + pattern); } } } }(good|bad)day既可以匹配goodday又可以匹配badday 2.捕获分组,将括号内的子表达式捕获的字符串存放到匹配结果中,供匹配完成后访问 namespace ConsoleApplication { class Program { static void Main(string[] args) { string pattern = @"(w+)@(w+.w+)"; string inputs = "theonegis@qq.com"; Regex regex = new Regex(pattern); if (regex.IsMatch(inputs)) { Console.WriteLine(inputs + " matches " + pattern); MatchCollection collections = Regex.Matches(inputs,pattern); foreach (Match match in collections) { Console.WriteLine("Local Address: {0}",match.Groups[1].Value); Console.WriteLine("Server Address: {0}",match.Groups[2].Value); Console.WriteLine(); } } else { Console.WriteLine(inputs + " dose not match " + pattern); } } } }运行结果: theonegis@qq.com matches (w+)@(w+.w+) Local Address : theonegis Server Address: qq.com 注意:
3.不捕获文本的括号 如果正则表达式很复杂,或者需要处理的文本很长,捕获分组会降低效率
4.反向引用,在表达式的某一部分,动态重复之前的子表达式所匹配的文本 namespace ConsoleApplication { class Program { static void Main(string[] args) { string pattern = @"<(w+)>[^<]+</(1)>"; string inputs = "<div>TheOneGIS</div>"; Regex regex = new Regex(pattern); if (regex.IsMatch(inputs)) { Console.WriteLine(inputs + " matches " + pattern); } else { Console.WriteLine(inputs + " dose not match " + pattern); } } } }实例中第一个<div>匹配<(w+)>,TheOneGIS匹配[^<]+,表示非<字符,后面的</div>匹配</(1)>,(1)表示和第一个匹配结果相同的匹配。
锚点(规定匹配的位置) b单词分界符锚点 b表示单词分界符,要求一侧是单词字符,另一侧是非单词字符 单词字符通常是指的是英文字符、数字字符,对中文不适用 非单词字符通常指的是各种标点符号和空白字符
^匹配一行的开头 $匹配一行的末尾 A匹配整个字符串的开头 Z匹配整个字符串的末尾 环视 锚点对位置的判断不够灵活 应用子表达式对位置进行判断
环视结构仅用于布尔判断,结构内的子表达式所匹配的文本,不会保存在整个表达式的匹配结果之中 逆序环视结构对子表达式存在限制,.NET中没有限制。
匹配模式:改变某些结构的匹配规则 I: Case Insensitive 不区分大小写 S: Single Line (dot all) 点号通配 M: Multi Line 多行模式 X: Comment 注释模式 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |