正则表达式

什么是正则表达式?

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

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

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

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

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

 

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

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

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

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

 

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

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

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

  bool IsMatch(string input, string pattern);

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

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

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

 bool IsMatch(string input, string pattern, RegexOptions options);

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

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

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

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

bool IsMatch(string input, string pattern, RegexOptions options, TimeSpan matchTimeout);

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

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

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

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

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

静态方法Match

Match Match(string input, string pattern);

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

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

 

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

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

IgnoreCase  i  不区分大小写

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

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

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

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

 

 

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

字符  说明

定位元字符

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

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

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

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

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

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

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

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

 

基本语法元字符

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

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

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

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

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

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

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

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

 

反义字符

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

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

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

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

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

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

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

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

 

重复描述字符

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

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

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

?  重复零次或一次

+  重复一次或更多次

*  重复零次或更多次

 

 

择一匹配

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

 

对正则表达式分组()

用小括号来指定子表达式(也叫做分组)

 

 

示例一:  区配开始 ^

  string str = "I am Blue cat";          

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

示例二: 区始结束 $

  string str = "I am Blue cat";          

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

 

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

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));

 

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

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

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

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

 

示例:校验输入内容是否为合法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));

 

 

示例一:查找数字或字母

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

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

string newStrFind=String.Empty;

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

 newStr.Cast<Match>().Select(m => m.Value).ToList<string>().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));

 

 

示例一:重复单字符 和 重复分组字符

Console.WriteLine("请输入一个任意字符串,测试分组:");

string inputStr = Console.ReadLine();

string strGroup1 = @"a{2}";

Console.WriteLine("单字符重复2两次替换为22,结果为:"+Regex.Replace(inputStr, strGroup1,"22"));

//重复 多个字符 使用(abcd){n}进行分组限定

string strGroup2 = @"(ab\w{2}){2}";

Console.WriteLine("分组字符重复2两次替换为5555,结果为:" + Regex.Replace(inputStr, strGroup2, "5555"));

示例二:校验IP4地址(如:192.168.1.4,为四段,每段最多三位,每段最大数字为255,并且第一位不能为0)

string regexStrIp4 = @"^(((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?))$";

Console.WriteLine("请输入一个IP4地址:");

string inputStrIp4 = Console.ReadLine();

Console.WriteLine(inputStrIp4 + " 是否为合法的IP4地址:" + Regex.IsMatch(inputStrIp4, regexStrIp4));

Console.WriteLine("请输入一个IP4地址:");

string inputStrIp4Second = Console.ReadLine();          

Console.WriteLine(inputStrIp4 + " 是否为合法的IP4地址:" + Regex.IsMatch(inputStrIp4Second, regexStrIp4));

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值