正则表达式

什么是正则表达式?

英文Regular

Expression,是计算机科学的一个重要概念,她使用一种数学算法来解决计算机程序中的文本检索,匹配等问题,正则表达式语言是一种专门用于字符串处理的语言。在很多语言中都提供了对它的支持,c#也不例外,它可以帮我们解决下面的问题:

1,检索:通过正则表达式,从字符串中获取我们想要的部分

 2,匹配:判断给定的字符串是否符合正则表达式的过滤逻辑

你可以认为正则表达式表述了一个字符串的书写规则

判断用户输入的密码是否合法,判断用户输入的邮箱格式是否合法

正则表达式的组成

正则表达式就是由普通字符以及特殊字符(成为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。

常用的操作正则表达式的方法和委托

下面学习一下位于System.Text.RegularExpressions下的Regex类的一些静态方法和委托

1,静态方法IsMatch

(返回值是一个布尔类型,用于判断指定的字符串是否与正则表达式字符串匹配,它有三个重载方法)

  bool

IsMatch(string input, string pattern);

  参数: 

 input:       要搜索匹配项的字符串。

  pattern:     要匹配的正则表达式模式。

  返回结果:  如果正则表达式找到匹配项,则为 true;否则,为 false。

  boolIsMatch(string input, string pattern, RegexOptions options);

  参数: 

 input:       要搜索匹配项的字符串。

  pattern:     要匹配的正则表达式模式。

  options:     枚举值的一个按位组合,这些枚举值提供匹配选项。

  返回结果:  如果正则表达式找到匹配项,则为 true;否则,为 false。

  boolIsMatch(string input, string pattern, RegexOptions options, TimeSpanmatchTimeout);

  参数: 

 input:        要搜索匹配项的字符串。

  pattern:      要匹配的正则表达式模式。

  options:      枚举值的一个按位组合,这些枚举值提供匹配选项。

  matchTimeout:超时间隔,或 System.Text.RegularExpressions.Regex.InfiniteMatchTimeout 指示该方法不应超时。

  返回结果:  如果正则表达式找到匹配项,则为 true;否则,为 false。

关于参数RegexOptions

它是一个枚举类型,有以下枚举值

RegexOptions枚举值         内联标志         简单说明

ExplicitCapture                    n                    只有定义了命名或编号的组才捕获

IgnoreCase                          i                     不区分大小写

IgnorePatternWhitespace     x                   消除模式中的非转义空白并启用由# 标记的注释。

MultiLine                                m                 多行模式,其原理是修改了^和$的含义

SingleLine                              s                  单行模式,和MultiLine相对应

内敛标志可以更小力度(一组为单位)的定义匹配选项

静态方法Match(System.Text.RegularExpressions)静态方法Match(System.Text.RegularExpressions)

静态方法Match,使用指定的匹配选项在输入字符串中搜索指定的正则表达式的第一个匹配项。

返回一个包含有关匹配的信息的对象。同样有三个重载方法,参数和IsMatch方法相同。此外,在Regex类中,还有一个同名的非静态方法,适用于多个实例的情况下,效率更高一些。

Match Match(string input, string pattern);

Match Match(string input, string pattern, RegexOptions options);

Match Match(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);

静态方法Matches(System.Text.RegularExpressions)

静态方法Matches,在指定的输入字符串中搜索指定的正则表达式的所有匹配项。跟上面方法不同之处,就是这个方法返回的是所有匹配项,他同样有三个重载方法,并且参数和Match方法完全相同

  MatchCollectionMatches(string input, string pattern);

  MatchCollectionMatches(string input, string pattern, RegexOptions options);

  MatchCollectionMatches(string input, string pattern, RegexOptions options, TimeSpanmatchTimeout);

Replaces函数(System.Text.RegularExpressions)

我们知道正则表达式主要是实现验证,提取,分割,替换字符的功能.Replace函数是实现替换功能的.

1 )Replace(string input,stringpattern,string replacement) 

//input是源字符串,pattern是匹配的条件,replacement是替换的内容,就是把符合匹配条件pattern的内容转换成它

比如string result =Regex.Replace("abc", "ab", "##"); 

//结果是##c,就是把字符串abc中的ab替换成##

2 )Replace(string input,string pattern,string replacement,RegexOptions options)      

//RegexOptions是一个枚举类型,用来做一些设定.

//前面用注释时就用到了RegexOptions.IgnorePatternWhitespace.如果在匹配时忽略大小写就可以用RegexOptions.IgnoreCase

比如string result =Regex.Replace("ABc", "ab", "##",RegexOptions.IgnoreCase);

如果是简单的替换用上面两个函数就可以实现了.但如果有些复杂的替换,比如匹配到很多内容,不同的内容要替换成不同的字符.就需要用到下面两个函数

3 )Replace(string input,stringpattern,MatchEvaluator evaluator);   

//evaluator是一个代理,其实简单的说是一个函数指针,把一个函数做为参数参进来

//由于C#里没有指针就用代理来实现类似的功能.你可以用代理绑定的函数来指定你要实现的复杂替换.

4 )Replace(string input,string pattern,MatchEvaluator evaluator,RegexOptions options);

//这个函数上上面的功能一样,只不过多了一点枚举类型来指定是否忽略大小写等设置

静态方法Split拆分文本

使用正则表达式匹配的位置,将文本拆分为一个字符串数组,同样有三个重载方法,返回值为字符串数组

string[] Split(string input, string pattern);

string[] Split(string input, string pattern, RegexOptions options);

string[] Split(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);

@符号

我们经常在正则表达式字符串前面加上@字符,这样不让编译器去解析其中的转义字符,而作为正则表达式的语法(元字符)存在。

string s =@"www.baidu.com \n lkjsdflkj";

定位元字符

我们经常在正则表达式字符串前面加上@字符,这样不让编译器去解析其中的转义字符,而作为正则表达式的语法(元字符)存在。

字符  说明

\b  匹配单词的开始或结束

\B  匹配非单词的开始或结束

^  匹配必须出现在字符串的开头或行的开头

$  匹配必须出现在以下位置:字符串结尾、字符串结尾处的\n 之前或行的结尾。

\A  指定匹配必须出现在字符串的开头(忽略Multiline 选项)。

\z  指定匹配必须出现在字符串的结尾(忽略Multiline 选项)。

\z  指定匹配必须出现在字符串的结尾或字符串结尾处的\n 之前(忽略 Multiline 选项)。

\G  指定匹配必须出现在上一个匹配结束的地方。与Match.NextMatch() 一起使用时,此断言确保所有匹配都是连续的。

定位元字符示例

示例一:  区配开始^

  stringstr = "I am Blue cat";          

  Console.WriteLine(Regex.Replace(str,"^","准备开始:"));

示例二: 区始结束 $

  stringstr = "I am Blue cat";          

  Console.WriteLine(Regex.Replace(str,"$", "  结束了!"));

基本语法元字符

字符  说明

.  匹配除换行符以外的任意字符

\w  匹配字母、数字、下划线、汉字  (指大小写字母、0-9的数字、下划线_)

\W  \w的补集  ( 除“大小写字母、0-9的数字、下划线_”之外)

\s  匹配任意空白符  (包括换行符/n、回车符/r、制表符/t、垂直制表符/v、换页符/f)

\S  \s的补集  (除\s定义的字符之外)

\d  匹配数字  (0-9数字)

\D  表示\d的补集  (除0-9数字之外)

在正则表达式中,\是转义字符. * 是元字符 如果要表示一个\ .

*字符的话,需要使用\\ \. \*

示例

示例一:校验只允许输入数字

string strCheckNum1 =

"23423423a3", strCheckNum2 = "324234";

Console.WriteLine("匹配字符串"+strCheckNum1+"是否为数字:"+Regex.IsMatch(strCheckNum1,@"^\d*$"));

Console.WriteLine("匹配字符串" +strCheckNum2 + "是否为数字:" + Regex.IsMatch(strCheckNum2,@"^\d*$"));

示例二:校验只允许输入除大小写字母、0-9的数字、下划线_以外的任何字

string strCheckStr1 ="abcds_a", strCheckStr2 = "**&&((((2", strCheckStr3= "**&&((((";

string regexStr = @"^\W*$";

Console.WriteLine("匹配字符串" +strCheckStr1 + "是否为除大小写字母、0-9的数字、下划线_以外的任何字符:" +Regex.IsMatch(strCheckStr1, regexStr));

Console.WriteLine("匹配字符串" +strCheckStr2 + "是否为除大小写字母、0-9的数字、下划线_以外的任何字符:" +Regex.IsMatch(strCheckStr2, regexStr));

Console.WriteLine("匹配字符串" +strCheckStr3 + "是否为除大小写字母、0-9的数字、下划线_以外的任何字符:" +Regex.IsMatch(strCheckStr3, regexStr));

反义字符

字符  说明

\W  \w的补集  ( 除“大小写字母、0-9的数字、下划线_”之外)

\S  \s的补集  (除\s定义的字符之外)

\D  表示\d的补集  (除0-9数字之外)

\B  匹配不是单词开头或结束的位置

[ab]  匹配中括号中的字符

[a-c]  a字符到c字符之间是字符

[^x]  匹配除了x以外的任意字符

[^adwz]  匹配除了adwz这几个字符以外的任意字符

//示例:查找除ahou这之外的所有字符

string strFind1 = "I am aCat!", strFind2 = "My Name's Blue cat!";            

Console.WriteLine("除ahou这之外的所有字符,原字符为:"+ strFind1 + "替换后:" + Regex.Replace(strFind1,@[^ahou]","*"));

Console.WriteLine("除ahou这之外的所有字符,原字符为:"+ strFind2 + "替换后:" + Regex.Replace(strFind2, @"[^ahou]", "*"));

重复描述字符

字符  说明

{n}  匹配前面的字符n次

{n,}  匹配前面的字符n次或多于n次

{n,m}  匹配前面的字符n到m次

?  重复零次或一次

+  重复一次或更多次

*  重复零次或更多次

示例:校验输入内容是否为合法QQ号(备注:QQ号为5-12位数字)

string isQq1 = "1233", isQq2 ="a1233", isQq3 = "0123456789123", isQq4 ="556878544";

string regexQq = @"^\d{5,12}$";

Console.WriteLine(isQq1+"是否为合法QQ号(5-12位数字):"+ Regex.IsMatch(isQq1, regexQq));

Console.WriteLine(isQq2 +"是否为合法QQ号(5-12位数字):" + Regex.IsMatch(isQq2, regexQq));

Console.WriteLine(isQq3 +"是否为合法QQ号(5-12位数字):" + Regex.IsMatch(isQq3, regexQq));

Console.WriteLine(isQq4 +"是否为合法QQ号(5-12位数字):" + Regex.IsMatch(isQq4, regexQq));

择一匹配

字符  说明

 |         将两个匹配条件进行逻辑“或”(Or)运算。

示例一:查找数字或字母

string findStr1 = "ad(d3)-df";

string regexFindStr =@"[a-z]|\d";

string newStrFind=String.Empty;

MatchCollection newStr =  Regex.Matches(findStr1, regexFindStr);

 newStr.Cast().Select(m =>m.Value).ToList().ForEach(i => newStrFind += i);

Console.WriteLine(findStr1 +"中的字母和数字组成的新字符串为:" + newStrFind);

示例二:将人名输出("zhangsan;lisi,wangwu.zhaoliu")

string strSplit ="zhangsan;lisi,wangwu.zhaoliu";

string regexSplitstr =@"[;]|[,]|[.]";

Regex.Split(strSplit,regexSplitstr).ToList().ForEach(i => Console.WriteLine(i));

示例三:校验国内电话号码

(支持三种写法校验 A. 010-87654321 B.(010)87654321 C.01087654321 D.010 87654321)

string TelNumber1 ="(010)87654321", TelNumber2 = "010-87654321", TelNumber3 ="01087654321",

       TelNumber4 = "09127654321", TelNumber5 ="010)87654321",TelNumber6="(010-87654321",

       TelNumber7="91287654321";

Regex RegexTelNumber3 = new Regex(@"\(0\d{2,3}\)[- ]?\d{7,8}|^0\d{2,3}[- ]?\d{7,8}$");

Console.WriteLine("电话号码 " +TelNumber1 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber1));

Console.WriteLine("电话号码 " +TelNumber2 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber2));

Console.WriteLine("电话号码 " +TelNumber3 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber3));

Console.WriteLine("电话号码 " +TelNumber4 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber4));

Console.WriteLine("电话号码 " +TelNumber5 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber5));

Console.WriteLine("电话号码 " +TelNumber6 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber6));

Console.WriteLine("电话号码 " +TelNumber7 + " 是否合法:" + RegexTelNumber3.IsMatch(TelNumber7));

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容

  • 初衷:看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印...
    DCbryant阅读 3,999评论 0 20
  • /* * 索引器: * 作用:让对象具有快速访问元素的能力 * 索引器和数组的区别: * 1.索引器的索引类型不限...
    Unity开发阅读 1,100评论 0 0
  • iOS中使用正则表达式就不得不提NSRegularExpression,所以我们需要先搞清楚什么是NSRegula...
    sunmumu1222阅读 2,335评论 0 4
  • Java的正则表达式讲解:(为了能看清,本文正则表达式用中文的句号代替英文句点) 英文句点符号:匹配单个任意字符。...
    红姑娘阅读 4,354评论 0 2
  • python的re模块--细说正则表达式 可能是东半球最详细最全面的re教程,翻译自官方文档,因为官方文档写的是真...
    立而人阅读 22,855评论 4 46