正则表达式是正则表达式引擎尝试匹配输入文本的一种模式。 模式由一个或多个字符文本、运算符或构造组成。
关于正则表达式可以参考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 注释模式
原文链接:https://www.f2er.com/regex/362000.html