正则表达式构造

前端之家收集整理的这篇文章主要介绍了正则表达式构造前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

猜你在找的正则表达式相关文章