架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 97|回复: 0

[资料] 正则表达式基础

[复制链接]
发表于 2019-6-18 21:38:16
zu
本帖最后由 空蝉如此世 于 2019-6-18 21:39 编辑

前言
在项目中做一些数据匹配,规则限定,爬虫分析数据的时候,我们会用到正则表达式。下面整理了一下正则的基础知识,全都是早年的学习笔记。

正文

#正则表达式基础


.           表示除\n之外的任意的单个字符
[]         字符的筛选
[^]       相当于 非
|           表示或的意思
()         改变运算的优先级。
*          限定符,表示前面的表达式出现0次或多次。
+         限定符,表示前边的表达式必须出现1次或者多次。至少得出现1次。
?          限定符,表示前边的表达式必须出现0次或者1次。
{n}       限定符,限定前边的表达式必须出现n次。
{n,}      限定符,限定前边的表达式至少出现n次。
{n,m}   限定符,限定前边的表达式至少出现n次,最多出现m次。
^  $     表示的是字符串的开头和结尾
\d        等价于[0-9]  
\D       等价于[^0-9]
\s        表示所有那些空白符 不可见字符
\S        就是除了\s以外的所有字符。
\w       表示[0-9a-zA-Z_]
\W      就是除了\w之外的所有其他字符。
\b       表示单词的边界。 (断言,只判断,不匹配。)
=================================================


.    表示除\n之外的任意的单个字符
a.b
a,b
=========================================
[] 字符的筛选
a[0-9]b
a[a-z]b

a[0-9a-zA-Z]b
a1b
axb
aAb

a[^0-9]b  表示a与b之间只能出现除了0123456789之外的任意单个字符。

a[^0-9a-z]b

=====================================================
|  表示或的意思


z|food 由于| 的优先级非常低,所以这个表达式可以匹配  z  或 food 这个表达式不匹配zood

(z|f)ood 才表示zood或者food

===========================================
()改变运算的优先级。

提取组。

=======================================
* 限定符,表示前面的表达式出现0次或多次。

zoo*     表示zo zoo  zoooooooo
(zoo)*   表示zoozoo.......
a.*b     表示ab   aaddddb     afjdsklf%$#@dsklfjdsklfjdsklfjb


================================================
+ 限定符,表示前边的表达式必须出现1次或者多次。至少得出现1次。

a.+b
a9dfjsakl3824urnj324239feb
==================================================
? 限定符,表示前边的表达式必须出现0次或者1次。

a.?b
ab
axb


? 的另外一个作用就是“终止贪婪模式”。正则表达式默认是贪婪模式。

======================================================================
a[0-9]+b

a0b
a00b
a09b
a99999999999999999999b


==========================其他限定符=====================
{n}  限定符,限定前边的表达式必须出现n次。
a[0-9]{10}b
a1234567899b
======================
{n,} 限定符,限定前边的表达式至少出现n次。

1[a-z]{3,}2
1axffdsafdsafdasfdsafdsafdsafdsfdsafsdfdsfdsfdsa2



========================================
{n,m} 限定符,限定前边的表达式至少出现n次,最多出现m次。

a[0-9]{3,7}b
a0000000b

===========================================

^表示的是字符串的开头

$表示字符串的结尾。


^ 和 $ 就表示的是字符串的两个特征。一个表示开头的特征,一个表示结尾的特征


^abc.*xyz$     ^abc122345xyz$   

^abcdefg$     ^abcdefg


fdsfdsfxyz   xyz$



===========================================
a[0-9]b
a\db

\d等价于[0-9]
digital

\D   [^0-9]


\s 表示所有那些空白符,不可见字符
a\s*b
ab
a                                              




b

\S    就是除了\s以外的所有字符。



=================================================
\w [0-9a-zA-Z_]  
word表示单词字符。

\W 就是除了\w之外的所有其他字符。

\b表示单词的边界。 (断言,只判断,不匹配。)

============================================

.


下面这几种方式就可以表示任意的单个字符出现在ab之间。
a[\s\S]b
a[\d\D]b
a[\w\W]b






#实战

1:新建控制台应用程序

2:贴入以下代码,可以一个模块一个模块的测试

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Text;
  6. using System.Text.RegularExpressions;
  7. using System.Threading.Tasks;

  8. namespace ConsoleApplication16_正则表达式
  9. {
  10.     class Program
  11.     {
  12.         static void Main(string[] args)
  13.         {
  14.             //Regex.IsMatch(); //判断是否匹配
  15.             //Regex.Match();//提取某个(一个)匹配
  16.             //Regex.Matches();//提取所有的匹配
  17.             //Regex.Replace();//替换
  18.             //Regex.Split();//分割
  19.             //要想验证完全匹配6位数字,则必须在正则表达式两端加开始^和结束$


  20.             //Regex.IsMatch  是否匹配   返回bool类型
  21.             //Console.WriteLine(Regex.IsMatch("pig", "p[a-z]g"));
  22.             //Console.WriteLine(Regex.IsMatch("p1g", "p[a-z]g"));
  23.             //Console.WriteLine(Regex.IsMatch("p1g", "p[a-z0-9]g"));
  24.             //Console.WriteLine(Regex.IsMatch("pi1g", "p[a-z0-9]g"));
  25.             //Console.WriteLine(Regex.IsMatch("pi1g", "p[a-z][0-9]g"));





  26.             //要想验证完全匹配6位数字,则必须在正则表达式两端加开始^和结束$
  27.             //不加^ $这两个符号 则表示 整个字符串中只要有一部分匹配给定的字符串则返回true
  28.             //>10  and  <=20 的所有数字字符串
  29.             //while (true)
  30.             //{
  31.             //    Console.WriteLine("请输入");
  32.             //    string input = Console.ReadLine();
  33.             //    bool b = Regex.IsMatch(input, "^(1[1-9]|20)[        DISCUZ_CODE_0        ]quot;);//  1[1-9]|20
  34.             //    Console.WriteLine(b);
  35.             //}


  36.             //while (true)
  37.             //{
  38.             //    Console.WriteLine("请输入");
  39.             //    string msg = Console.ReadLine();
  40.             //    //1. 这个正则表达式本身只匹配z或food
  41.             //    //2. 但是由于正则两端没有加^和$,所以整个给定字符串中只要有任何一个部分与字符串z或food匹配,则返回true
  42.             //    bool b = Regex.IsMatch(msg, "z|food");
  43.             //    Console.WriteLine(b);
  44.             //}




  45.             //while (true)
  46.             //{
  47.             //    Console.WriteLine("请输入");
  48.             //    string msg = Console.ReadLine();

  49.             //    //因为这个正则表达式使用了|字符,所以该正则表达式
  50.             //    //的意思是:^z  或  food$
  51.             //    //即:所有以z开头的字符串  或者  所有以 food结尾的字符串。
  52.             //    bool b = Regex.IsMatch(msg, "^z|food[        DISCUZ_CODE_0        ]quot;);
  53.             //    Console.WriteLine(b);
  54.             //}





  55.             //while (true)
  56.             //{
  57.             //    Console.WriteLine("请输入");
  58.             //    string msg = Console.ReadLine();

  59.             //    //  ^z$

  60.             //    //  ^food$
  61.             //    //所以这个正则表达式只能匹配 一个字母  z  或者一个单词 food
  62.             //    bool b = Regex.IsMatch(msg, "^(z|food)[        DISCUZ_CODE_0        ]quot;);
  63.             //    Console.WriteLine(b);
  64.             //}




  65.             //while (true)
  66.             //{
  67.             //    Console.WriteLine("请输入");
  68.             //    string msg = Console.ReadLine();
  69.             //    //zood   food
  70.             //    bool b = Regex.IsMatch(msg, "^(z|f)ood[        DISCUZ_CODE_0        ]quot;);
  71.             //    Console.WriteLine(b);
  72.             //}


  73.             //while (true)
  74.             //{
  75.             //    Console.WriteLine("请输入");
  76.             //    string msg = Console.ReadLine();
  77.             //    //这个只能匹配  字母 z 或者 单词 food
  78.             //    //这个正则表达式等价于  ^(z|food)$
  79.             //    bool b = Regex.IsMatch(msg, "(^z$)|(^food$)");
  80.             //    Console.WriteLine(b);
  81.             //}





  82.             //while (true)
  83.             //{
  84.             //    Console.WriteLine("请输入邮政编码");
  85.             //    string input = Console.ReadLine();
  86.             //    //默认.net采用的是unicode字符匹配,所以中文的123456也是匹配的。
  87.             //    //bool b = Regex.IsMatch(input, @"^\d{6}[        DISCUZ_CODE_0        ]quot;);
  88.             //    //指定RegexOptions.ECMAScript选项后,\d就只表示普通的数字,不在包含全角的字符了。
  89.             //    bool b = Regex.IsMatch(input, @"^\d{6}[        DISCUZ_CODE_0        ]quot;,RegexOptions.ECMAScript);
  90.             //    Console.WriteLine(b);
  91.             //}



  92.             //while (true)
  93.             //{
  94.             //    Console.WriteLine("请输入身份证号码");
  95.             //    string input = Console.ReadLine();
  96.             //    //bool b = Regex.IsMatch(input, @"^([1-9]\d{14}|[1-9]\d{16}[0-9xX])[        DISCUZ_CODE_0        ]quot;);
  97.             //    bool b = Regex.IsMatch(input, @"^([1-9]\d{14})(\d{2}[0-9xX])?[        DISCUZ_CODE_0        ]quot;);
  98.             //    Console.WriteLine(b);
  99.             //}



  100.             //while (true)
  101.             //{
  102.             //    Console.WriteLine("请输入手机号码");
  103.             //    string input = Console.ReadLine();
  104.             //    bool b = Regex.IsMatch(input, @"^((\d{3,4}-?\d{7,8})|\d{5}|[1-9]\d{10})[        DISCUZ_CODE_0        ]quot;);
  105.             //    Console.WriteLine(b);
  106.             //}



  107.             //while (true)
  108.             //{
  109.             //    Console.WriteLine("请输入邮箱");
  110.             //    string input = Console.ReadLine();
  111.             //    //.出现在[]中,就表示一个普通的.可以不转义。
  112.             //    //-出现在[]中的第一个位置的时候可以不转义。
  113.             //    //bool b = Regex.IsMatch(input, @"^[a-zA-Z0-9._-]+@[0-9a-zA-Z-]+([.][0-9a-zA-Z]+{1,}[        DISCUZ_CODE_0        ]quot;);
  114.             //    bool b = Regex.IsMatch(input, @"^\w+@\w+([.]\w+{1,}[        DISCUZ_CODE_0        ]quot;,RegexOptions.ECMAScript);
  115.             //    Console.WriteLine(b);
  116.             //}




  117.             //-----------Regex.Match  将匹配的字符串提取出来 返回Match
  118.             //Match mc = Regex.Match("今天是2015年", @"\d{4}");  //匹配出来值为2015
  119.             //if (mc.Success)
  120.             //{
  121.             //    Console.WriteLine(mc.Value);
  122.             //}

  123.             //MatchCollection mc = Regex.Matches("今天是2015年4月18日", @"\d{1,4}");
  124.             //foreach (Match item in mc)
  125.             //{
  126.             //    if (item.Success)
  127.             //    {
  128.             //        Console.WriteLine(item.Value);
  129.             //    }
  130.             //}



  131.             //string str = Regex.Replace("今天是2015年4月18日", @"\d{4}", "新年好哇");
  132.             //Console.WriteLine(str);



  133.             //提取分组
  134.             //string regex = @"(\w+)@(\w+)((\.\w+){1,2})";

  135.             //Match mc = Regex.Match("abc123@qq.com.cn", regex);

  136.             //if (mc.Success)
  137.             //{

  138.             //    //Console.WriteLine(mc.Groups[0]);当前匹配的字符串
  139.             //    Console.WriteLine(mc.Groups[1].Value);
  140.             //    Console.WriteLine(mc.Groups[2].Value);
  141.             //    Console.WriteLine(mc.Groups[3].Value);
  142.             //}



  143.             //判断是否是合法的日期格式2016-12-08  四位数字-两位数字-两位数字
  144.             //bool b=Regex.IsMatch("2016-12-08", @"\d{4}-(0[1-9]|1[1-2])-(0[1-9]|[1-2]\d|3[0-1])");
  145.             //Console.WriteLine(b);


  146.             //string path = @"C:\windows\1\2\3\4\5\testb.txt";
  147.             //Match mc = Regex.Match(path, @".+\\(\w+\.\w+)");
  148.             //if (mc.Success)
  149.             //{
  150.             //    Console.WriteLine(mc.Groups[0]);
  151.             //    Console.WriteLine(mc.Groups[1]);
  152.             //}



  153.             //string str = "June     26.      1951";
  154.             //Match mc = Regex.Match(str, @"([A-Za-z]+)\s+(\d+)\.\s+(\d+)");
  155.             //if (mc.Success)
  156.             //{
  157.             //    Console.WriteLine(mc.Groups[1]);
  158.             //    Console.WriteLine(mc.Groups[2]);
  159.             //    Console.WriteLine(mc.Groups[3]);
  160.             //}




  161.             //192.168.10.5[port=21,type=ftp]
  162.             //192.168.10.5[port=21]

  163.             //string ipAddress = "192.168.10.5[port=21]";
  164.             //Match mc = Regex.Match(ipAddress, @"(?<ip>\d{3}(\.\d{1,3}){3})\[(?<port>\w+=[0-9]{1,5})(,(?<type>\w+=\w+))?\]");
  165.             //if(ipAddress.Contains("type"))
  166.             //{
  167.             //    if (mc.Success)
  168.             //    {
  169.             //        Console.WriteLine("ip地址是{0},端口号是{1},类型是{2}", mc.Groups["ip"], mc.Groups["port"], mc.Groups["type"]);
  170.             //    }
  171.             //}
  172.             //else
  173.             //{
  174.             //    Console.WriteLine("ip地址是{0},端口号是{1},类型是type=http", mc.Groups["ip"], mc.Groups["port"]);
  175.             //}




  176.             //?终止贪婪模式
  177.             //Match match = Regex.Match("大家好。我是S.H.E。我22岁了。我病了,呜呜。fffff", "我是(.+?)。");
  178.             //if (match.Success)
  179.             //{
  180.             //    Console.WriteLine(match.Value);
  181.             //    Console.WriteLine(match.Groups[1]);
  182.             //}



  183.             //WebClient web = new WebClient();
  184.             //string html = web.DownloadString("https://car.autohome.com.cn/photolist/series/4139/p1/?pvareaid=101196");

  185.             //MatchCollection mc = Regex.Matches(html, @"<img.+?(?<picSrc>http://car\d\..+?\.jpg).+?>");
  186.             //int i = 0;
  187.             //foreach (Match item in mc)
  188.             //{
  189.             //    if (item.Success)
  190.             //    {
  191.             //        i++;
  192.             //        //Console.WriteLine(item.Value);
  193.             //        Console.WriteLine(item.Groups["picSrc"].Value);
  194.             //        //获得原路径
  195.             //        string src = item.Groups["picSrc"].Value;
  196.             //        //下载到电脑上的路径
  197.             //        string target = @"C:\Users\Administrator\Desktop" + "\" + i + ".jpg";
  198.             //        //开始下载
  199.             //        web.DownloadFile(src, target);
  200.             //    }
  201.             //}
  202.             //Console.WriteLine("下载成功!!!!");

  203.             Console.ReadKey();


  204.         }
  205.     }
  206. }
复制代码





尾声

正则表达式在线测试    http://tool.oschina.net/regex/
















上一篇:mysql如何修改root用户的密码
下一篇:Java Refactor——重新组织你的Java代码
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2019-7-22 00:52

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表