正则表达式是记录文本规则的代码,常用于文本匹配、文本替换及输入验证。正则表达式由两种基本字符类型组成:原义(正常)文本字符和元字符,然而,元字符是针对单个字符匹配的,要想要同时匹配多个字符的话,还需要借助限定符;下面介绍一些常见的元字符、限定符以及相关概念。

基本概念

1、常见元字符及限定符

元字符 说明
. 匹配除 \n 以外的任何字符(注意元字符是小数点)
[abcde] 匹配 abcde 之中的任意一个字符
[a-h] 匹配 a 到 h 之间的任意一个字符
[^fgh] 不与 fgh 之中的任意一个字符匹配
\w 匹配大小写英文字符及数字 0 到 9 之间的任意一个及下划线,相当于 [a-zA-Z0-9_]
\W 不匹配大小写英文字符及数字 0 到 9 之间的任意一个,相当于 [^a-zA-Z0-9_]
\s 匹配任何空白字符,相当于 [ \f\n\r\t\v]
\S 匹配任何非空白字符,相当于 [^\s]
\d 匹配任何 0 到 9 之间的单个数字,相当于 [0-9]
\D 不匹配任何 0 到 9 之间的单个数字,相当于 [^0-9]
[\u4e00-\u9fa5] 匹配任意单个汉字(这里用的是 Unicode 编码表示汉字的 )
限定符 说明
* 匹配 0 到多个元字符,相当于 {0,}
? 匹配 0 到 1 个元字符,相当于 {0,1}
{n} 匹配 n 个元字符
{n,} 匹配至少 n 个元字符
{n,m} 匹配 n 到 m 个元字符
+ 匹配至少 1 个元字符,相当于 {1,}
\b 匹配单词边界
^ 字符串必须以指定的字符开始
$ 字符串必须以指定的字符结束

1、由于在正则表达式中“ \ ”、“ ? ”、“ * ”、“ ^ ”、“ $ ”、“ + ”、“(”、“)”、“ | ”、“ { ”、“ [ ”等字符已经具有一定特殊意义,如果需要用它们的原始意义,则应该对它进行转义,例如希望在字符串中至少有一个“ \ ”,那么正则表达式应该这么写: \\+ ;

2、可以将多个元字符或者原义文本字符用括号括起来形成一个分组,比如 ^(13)[4-9]\d{8}$ 表示任意以 13开头的移动手机号码;

3、另外对于中文字符的匹配是采用其对应的 Unicode 编码来匹配的,对于单个 Unicode 字符,如 \u4e00 表示汉字“一”, \u9fa5 表示汉字“龥”,在 Unicode 编码中这分别是所能表示的汉字的第一个和最后一个的 Unicode 编码,在 Unicode 编码中能表示 20901 个汉字;

4、关于 \b 的用法,它代表单词的开始或者结尾,以字符串“ 123a 345b 456 789d ”作为示例字符串,如果正则表达式是“ \b\d{3}\b ”,则仅能匹配 456 ;

5、可以使用“ | ”来表示或的关系,例如 [z|j|q] 表示匹配 z 、 j 、 q 之中的任意一个字母。

2、分支

正则表达式里的分支条件指的是有几种规则,如果满足其中任意一种规则都会被匹配到,具体的方法就是用 | 把不同的规则分隔开。

下面以匹配不同区位电话号码为例,剖析一下分支的用法:

0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。

3、分组

如果重复单个字符,直接在字符后面加上限定符就行了;但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了。

下面以匹配IP地址为例,剖析一下分组的用法:

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)这个表达式中,((2[0-4]\d|25[0-5]|[01]?\d\d?)\.)匹配到小于255的正确数字,在这个子表达式 (分组)后面加上{3},表示将这个分组重复3次,最后再加上一个1到3位数字的分组,就能匹配到正确的IP地址了。

4、后向引用

使用小括号进行分组之后,匹配到的分组(子表达式),可以在表达式或其他程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。后向引用是用于重复搜索前面某个分组匹配的文本,例如,\1代表分组1匹配的文本。

\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty。这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。

5、零宽断言

在前面的元字符介绍中,我们已经知道了有这样一类字符,可以匹配一句话的开始(^)、结束($)或者匹配一个单词的开始、结束(\b)。这些元字符只匹配一个位置,指定这个位置满足一定的条件,而不是匹配某些字符,因此,它们被成为 零宽断言。所谓零宽,指的是它们不与任何字符相匹配,而匹配一个位置;所谓断言,指的是一个判断。正则表达式中只有当断言为真时才会继续进行匹配。

在有些时候,我们精确的匹配一个位置,而不仅仅是句子或者单词,这就需要我们自己写出断言来进行匹配。下面是断言的语法:

限定符 说明
(?=pattern) 前向肯定断言,匹配pattern前面的位置
(?!pattern) 前向否定断言,匹配后面不是pattern的位置
(?<=pattern) 后向肯定断言,匹配pattern后面的位置
(?<!pattern) 后向否定断言,匹配前面不是pattern的位置

1、前向肯定断言示例:比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc;

2、后向肯定断言示例:比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading;

3、前向否定断言示例:例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词;

4、后向否定断言示例:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。

6、贪婪与懒惰

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配

有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。例如,a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。

懒惰限定符 说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

Regex类

在C#中由Regex类,采用正则表达式实现字符串的匹配、提取、分割、替换。

1、字符串匹配

方法 IsMatch()
格式 Regex.IsMatch("字符串", "正则表达式")
作用 判断字符串是否符合模板要求
返回值 bool类型,代表是否匹配成功

2、字符串提取

方法 单次匹配Match()、 多次匹配Matches()
格式 Match match = Regex.Match("字符串", "正则表达式")
MatchCollection matches= Regex. Matches ("字符串", "正则表达式")
作用 1、提取匹配的子字符串
2、提取组。Groups的下标由1开始,0中存放match的value
返回值 Match类型、MatchCollection类型

3、字符串分割

方法 Split()
格式 Regex.Split("字符串", "正则表达式")
作用 根据条件分割字符串
返回值 字符串数组,string[]

4、字符串替换

方法 Replace()
格式 Regex.Replace("字符串", "正则表达式",“替换字符串”)
作用 在指定字符串内,使用指定字符串替换正则表达式匹配到的地方
返回值 string类型,替换之后的字符串

常用大全

说明 格式
匹配中文字符 [\u4e00-\u9fa5]
匹配网址URL [a-zA-z]+://[^\s]*
匹配Email地址 \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配国内电话号码 \d{3}-\d{8}|\d{4}-\d{7}
匹配国内手机号码 (86)*0*13\d{9}
匹配身份证号码 \d{15}|\d{18}
匹配IP地址 ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
匹配日期 ^[1-9]\d{3}([-|\/|\.])?((0\d)|([1-9])|(1[0-2]))\1(([0|1|2]\d)|([1-9])|3[0-1])$
匹配HTML标签 <Title>.*?</Title>
匹配HTML标签内容 (?<=<Title>).*?(?=</Title>)

正则表达式及常用大全相关推荐

  1. python 正则表达式re常用操作符 使用方法 怎么用re正则表达式表示一个IP地址:0-255

    正则表达式:(三种表达方法) regular expression regex RE 正则表达式是用来简洁表达一组字符串的表达式. 正则表达式: 通用的字符差表达框架 简洁表达一组字符串的表达式 针对 ...

  2. c#中regex的命名空间_C#_详解C#正则表达式Regex常用匹配,使用Regex类需要引用命名空间 - phpStudy...

    详解C#正则表达式Regex常用匹配 使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 一.利用Regex类实现验证 示例1:注释的代码所起 ...

  3. 正则表达式、常用的匹配总结

    1.正则表达式:我的理解就是,记录文本规则的代码,我主要运用它在.net表单验证中. 2.学习正则表达是的工具下载链接:https://sourceforge.net/projects/regexte ...

  4. Oracle 正则表达式以及常用正则函数

    Oracle 正则表达式以及常用正则函数 正则表达式简介 正则表达式基础 Oracle 常用正则函数 正则表达式简介 菜鸟教程 练习网站 软件下载 什么是正则表达式? 正则表达式,又称规则表达式.(英 ...

  5. 正则表达式与常用文本处理工具

    正则表达式与常用文本处理工具 正则表达式概述 基础正则表达式 基础正则表达式元字符 扩展正则表达式 概述 扩展元字符 文本处理器 grep 示例 sed sed 命令 示例 输出文件内容 删除符合条件 ...

  6. 正则表达式、常用类(Pattern类、Matcher类、Math类、System类、Random类、BigDecimal类、Date类、SimpleDateFormat类、Calendar类)

    JAVA学习第十六天-正则表达式.常用类(Pattern类.Matcher类.Math类.System类.Random类.BigDecimal类.Date类.SimpleDateFormat类.Cal ...

  7. 前端开发中的 正则表达式 及常用正则表达式大全

    RegExp 是正则表达式(Regular expression)的缩写,就是用一个"字符串"来描述一个特征,然后去验证另一个"字符串"是否符合这个特征.比如 ...

  8. 关于grep,egrep正则表达式的常用用法

    正则表达式是一类字符所书写的模式(pattern) 元字符:不表示字符本身的意义,而用于额外功能性的描述:而如果在这些特定的字符前加/这个符号那么这些字符就表示原有的意思. 正则表达式:基本正则表达式 ...

  9. python常用正则表达式_Python3常用正则表达式

    正则表达式速查表 字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个向后引用.或一个八进制转义符.例如,"n"匹配字符"n"."\ ...

  10. Linux 使用正则表达式的常用命令

    [grep 命令] 1.基本操作 1)作用:grep命令用于打印输出文本中匹配的模式串,它使用正则表达式作为模式匹配的条件. 2)命令格式:grep [选项] 要匹配的字符串 文件名 3)常见选项: ...

最新文章

  1. 数字图象处理之二维码图像提取算法(九)
  2. 三个可能会被计算机视觉技术改变的行业
  3. QT5利用chromium内核与HTML页面交互
  4. 获取ip地理位置的 api接口 简介
  5. EXTJS 重新加载树结点
  6. jquery滚动条到底部触发事件
  7. 华为动态NAT小实验演示
  8. 已经创建了AWS EC2实例,Linux系统默认没有root用户,那么如何创建root用户并更改为root用户登录呢?
  9. 如何将FAT32分区直接转为NTFS分区
  10. 【Codeforces549F】Yura and Developers [单调栈][二分]
  11. 安卓游戏时禁止状态栏下拉,如何在Android中禁用通知栏下拉菜单?
  12. 逻辑回归详解及Python实现
  13. 如何用hover实现下拉菜单
  14. Mac与Linux SSH无密登陆(互信)
  15. 06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
  16. Matlab中图形对象属性gca使用
  17. oracle 分组 最新,Oracle分组查询
  18. oracle 取流水号
  19. 5. 机器学习基石-Why can Machine Learn?
  20. 各大高校视频教程评定

热门文章

  1. php中的each()用法和list()用法
  2. -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; -webkit-font-smoothing: antialiased
  3. [洛谷P1501][国家集训队]Tree II(LCT)
  4. 大白话5分钟带你走进人工智能-第二节概率基础及高斯分布
  5. node.js安装以及git 的使用说明
  6. bzoj1010 [HNOI2008]玩具装箱toy
  7. 初探12306售票算法(一)- 理论
  8. 高质量程序设计指南c++/c语言(26)--默认参数
  9. Hearing Range
  10. MutationObserver监听页面是否加载完成