正则表达式

来源:互联网 发布:淘宝转让合法吗 编辑:程序博客网 时间:2024/06/08 08:49

http://www.cnblogs.com/reganLi/p/3400615.html


一、正则表达式概述

        正则表达式是用来进行文本处理的技术,是语言无关的,在几乎所有语言中都有实现。javascript中还会用到。【正则表达式是对文本、对字符串操作的。】

        一个正则表达式就是由普通字符以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。正则表达式用来描述字符串的特征。

二、正则表达式是对字符串进行操作的;

    [1]--正则表达式是对文本进行处理的一门技术,是和特定的语言无关的,在所有的语言中都可以使用;【C#、JS......】

    [2]--正则表达式是由普通字符以及特殊字符(元字符)组成的文字模式;

    [3]--正则表达式可以看做是可以模板,将某个字符模式与所搜索的字符串进行匹配;

三、正则表达式是非常复杂的,例如在编译的时候就是是用的 正则表达式来解析我们所写的那一堆字符串;

    [1]--字符串的匹配;

    [2]--字符串的提取;

    [3]--字符串的替换;

四、元字符系列

    [01]--. --匹配除\n之外的任何单个字符;  .k -- [pk, fk, tk;]   f.k -- [fkk, fik, fok, f8k.....];

    [02]--[]--匹配括号中的任何一个字符[]中是一个范围,一个字符集合;[123456789]、[qwerty]、[1v2n3m5j0]、[0-9]、[a-z]、[A-Z]、[a-zA-Z0-9];

    [03]--| --将|左右的两个匹配条件进行逻辑"或"运算; a|ewfw ======> a或ewfw;  (a|dd)asdfaw ======>aasdfaw或ddasdfaw;

    [04]--()--将 () 之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用;

       1--改变优先级;

       2--定义提取组;

    [05]--*--匹配0至多个在它之前的子表达式,和通配符*没关系;aaaab*----->就是说对于b可以有0个或者是多个aaaa、aaaab、aaaabbbbbb.....;

    [06]--+--匹配前面的子表达式一次或多次;

    [07]--?--匹配前面的子表达式零次或一次;

    [08]--{n}--匹配确定的 n 次;

    [09]--{n,}--至少匹配n次;

    [10]--{n,m}--最少匹配 n 次且最多匹配 m 次;

    [11]--^--匹配一行的开始;

    [12]--$--匹配行结束符;

五、简写表达式

    注意这些简写表达式是不考虑转义符的,这里的\就表示字符\,而不是C#字符串级别的\,在C#代码中需要使用@或者\双重转义。区分C#级别的转移和正则表达式级别的转移,恰好C#的转义符和正则表达式的转义符都是\而已。正则表达式的转义是在C#之后的(层层盘剥)。把C#的转义符想成%就明白了。在C#看来@"\-"就是\-这个普通的字符串,只不过在正则表达式分析引擎看来他有了特殊含义。"\\d"或者@"\d"

    [01]--\d--代表一个数字,等同于[0-9]   \\d  →\d;

    [02]--\D--代表非数字,等同于[^0-9];

    [03]--\s--代表换行符、Tab制表符等空白字符 ,(空格、回车、制表符);

    [04]--\S--代表非空白字符;

    [06]--\w--匹配字母或数字或下划线或汉字,即能组成单词的字符;

    [07]--\W--非\w ,等同于[^\w];

    [08]--\b--单词的边界;

    [d-->digital],[s-->space],[w-->word]

六、.Net中的正则表达式

    1、正则表达式在.Net就是用字符串表示,这个字符串格式比较特殊,无论多么特殊,在C#语言看来都是普通的字符串,具体什么含义由Regex类内部进行语法分析。

    2、正则表达式(Regular Expression)的主要类:Regex 常用的3种情况:(C#语法)     [Serializable, __DynamicallyInvokable]

       public class Regex : ISerializable{}

       -->判断是否匹配:Regex.IsMath("字符串","正则表达式");

       -->字符串提取[只提取一次,只能提取一个]:Regex.Math("字符串","被提取的字符串的正则表达式");

       -->字符串的提取[循环提取所有匹配的字符串]:Regex.Matches("字符串","被提取的字符串的正则表达式");

       -->字符串替换:Regex.Replace("字符串","正则表达式","替换内容");

    (1)判断是否匹配:Regex.IsMatch(“字符串”,”正则表达式”);

    (2)字符串提取:Regex.Match(“字符串”,“要提取的字符串的正则表达式”);//只能提取一个(提取一次)

    (3)字符串提取(循环提取所有): Regex.Matches(),(可以提取所有匹配的字符串。)

    (4)字符串替换:Regex.Replace(“字符串”,”正则”,”替换内容”);

    (5)Regex.Split();

    3、Regex.IsMatch方法用于判断一个字符串是否匹配正则表达式,字符串匹配例子:

    Regex.IsMatch("bbbbg","^b.*g$");

    Regex.IsMatch("bg", "^b.*g$");

    Regex.IsMatch("gege", "^b.*g$");

    一定不能忘了^和$,否则也能匹配yesbagit

七、.net正则表达式采用Unicode匹配规则

\d既能匹配1,2...等ASCII数字,也能匹配全角数字“1,2,3...”

\w既能匹配[a-zA-Z0-9_]也能匹配中文

\s既能匹配“英文空格”、制表符等,也能匹配“全角空格”。

如果要想让只匹配ASCII字符,则需要指定RegexOptions.ECMAScript选项。

 

八、字符串匹配案例:

    [01]--判断是否是合法的邮政编码(6位数字);

    [02]--判断是否为连续的5个英文字母;

    [03]--判断一个字符串是不是身份证号码,即是否是15或18位数字;

    [04]--判断字符串是否为正确的国内电话号码,不考虑分机;

    [05]--判断一个字符串是否是合法的Email地址;

    [06]--匹配IP地址,4段用.分割的最多三位数字;

    [07]--判断是否是合法的日期格式;

    [08]--判断是否是合法的url地址;

    将IsMatch的源码在此贴出:

public static bool IsMatch(string input, string pattern)

    {

        return IsMatch(input, pattern, RegexOptions.None, DefaultMatchTimeout);

    }

九、字符串提取案例

    [01]--提取字符串中的所有数字;

    [02]--提取字符串中的Email;

    [03]--如何提取用户名与域名;

    [04]--从文件路径中提取出文件名(包含后缀) ;

    将Match的源码在此贴出:

public static Match Match(string input, string pattern)

    {

           return Match(input, pattern, RegexOptions.None, DefaultMatchTimeout);

    }

 

public static MatchCollection Matches(string input, string pattern)

    {

           return Matches(input, pattern, RegexOptions.None, DefaultMatchTimeout);

    }

 

Match match = Regex.Match("age=32","^(.+)=(.+)$");

    if(match.Success)

    {

       Console.WriteLine(match.Group[1].Value);

       Console.WriteLine(match.Group[2].Value);

    }

  • match的Success属性表示是否匹配成功;
  • 正则表达式中用()将要提取的内容括起来,然后就可以使用Match的Groups属性来得到所有的提取元素,注意Groups属性的序号是从1开始的;
  • 如果正则表达式引擎可以找到匹配项, Groups 属性返回的 GroupCollection 对象的第一个元素将包含一个与整个正则表达式模式匹配的字符串;

十、贪婪模式与非贪婪模式

    [01]--"1111。11。111。111111。"

       贪婪:.+。(默认为贪婪模式,尽可能的多匹配。) ---------[1111。11。111。111111。](匹配结果)

       非贪婪:.+?。(尽可能的少匹配,(1个。))-----------[1111。]

    [02]--"大家好。我是S.H.E。我22岁了。我病了,呜呜。fffff"----->提取姓名

       贪婪:Regex.Match("大家好。我是S.H.E。我22岁了。我病了,呜呜。fffff","(.+)。");

           -->尽可能多的匹配,直到"贪婪"到不能再贪婪为止;

       非贪婪:Regex.Match("大家好。我是S.H.E。我22岁了。我病了,呜呜。fffff","(.+?)。");

           -->尽可能早的匹配;

十一、正则表达式可以从一段文本中将所有符合匹配的内容都输出来;

    -->Match获得的是匹配结果的第一个;

    -->Matches方法可以获得所有的匹配项;

十二、字符串替换

    [01]--Regex.Replace,将字符串中匹配的内容替换为指定的内容;

    [02]--将所有连续的a替换为一个A;

    [03]--删除所有连续的a;

    [04]--将连续的-都替换成一个-;

    [05]--给一个手机号码:13412345678, 134****5678,用正则表达式Replace();

    [06]--string s = Regex.Replace(“年龄=20”, @“(.+)=(.+)”, “$2是$1”)//把=替换成“是”;

    字符串替换源码

    public static string Replace(string input, string pattern, string replacement)

    {

         return Replace(input, pattern, replacement, RegexOptions.None, DefaultMatchTimeout);

    }

十三、字符串替换案例

    [01]--UBB翻译

    [02]--敏感词汇的处理

 

 

    整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$

    只能输入数字:"^[0-9]*$"。

    只能输入n位的数字:"^\d{n}$"。

    只能输入至少n位的数字:"^\d{n,}$"。

    只能输入m~n位的数字:。"^\d{m,n}$"

    只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。

    只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。

    只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。

    只能输入非零的正整数:"^\+?[1-9][0-9]*$"。

    只能输入非零的负整数:"^\-[1-9][]0-9"*$。

    只能输入长度为3的字符:"^.{3}$"。

    只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。

    只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。

    只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。

    只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。

    只能输入由数字、26个英文字母或者下划线组成的字符串:"^\w+$"。

    验证用户密码:"^[a-zA-Z]\w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。

    验证是否含有^%&'',;=?$\"等字符:"[^%&'',;=?$\x22]+"。

    只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"

    验证Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。

    验证Intern etURL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。

    验证电话号码:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。

    验证身份证号(15位或18位数字):"^\d{15}|\d{18}$"。

    验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。

    验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$

    只能输入数字:"^[0-9]*$"。

    只能输入n位的数字:"^\d{n}$"。

    只能输入至少n位的数字:"^\d{n,}$"。

    只能输入m~n位的数字:。"^\d{m,n}$"

    只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。

    只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。

    只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。

    只能输入非零的正整数:"^\+?[1-9][0-9]*$"。

    只能输入非零的负整数:"^\-[1-9][]0-9"*$。

    只能输入长度为3的字符:"^.{3}$"。

    只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。

    只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。

    只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。

    只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。

    只能输入由数字、26个英文字母或者下划线组成的字符串:"^\w+$"。

    验证用户密码:"^[a-zA-Z]\w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。

    验证是否含有^%&'',;=?$\"等字符:"[^%&'',;=?$\x22]+"。

    只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"

    验证Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。

    验证InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。

    验证电话号码:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。

    验证身份证号(15位或18位数字):"^\d{15}|\d{18}$"。

    验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。

    验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"

0 0
原创粉丝点击