加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式构造

发布时间:2020-12-14 01:54:19 所属栏目:百科 来源:网络整理
导读:正则表达式是正则表达式引擎尝试匹配输入文本的一种模式。 模式由一个或多个字符文本、运算符或构造组成。 关于正则表达式可以参考MSDN:http://msdn.microsoft.com/zh-cn/library/az24scfc(v=vs.110).aspx 字符组 形式一般为[...],匹配方括号中任意字符 na

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读