正则表达式构造

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

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

相关文章

正则替换html代码中img标签的src值在开发富文本信息在移动端...
正则表达式
AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它...
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及...
Python界一名小学生,热心分享编程学习。
收集整理每周优质开发者内容,包括、、等方面。每周五定期发...