0
点赞
收藏
分享

微信扫一扫

正则表达式构造


正则表达式是正则表达式引擎尝试匹配输入文本的一种模式。 模式由一个或多个字符文本、运算符或构造组成。

关于正则表达式可以参考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  注释模式


举报

相关推荐

0 条评论