正则表达式 笔记整理

简介

概念

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和 特殊字符(称为 “元字符")。
正则表达式使用单个字符串来描述、匹配一系列匹配某个语法规则的字符串。

为什么使用正则表达式

典型的搜索替换操作,针对静态文本的任务虽然足够,但缺乏灵活性。典型的方法可使用于动态文本,但会变得很困难
通过使用正则表达式,可以

  • 测试字符串内的模式
    例如,测试输入字符串,以及查看字符串内容是否出现电话号码或信用卡号码模式。称之为数据验证
  • 替换文本
    可以使用正则表达式来识别文档中的特定文本,完全删除文本或者用其他文本替换它。
  • 基于匹配模式从字符串中提取子字符串
    可以查找文档内或输入域内特定的文本

语法

普通字符

普通字符包括没有显示指定元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

元字符
字符说明
.匹配除换行符以外的任意字符
\w匹配字母、数字、下划线或汉字
\s匹配任意的空白符
\d匹配数字
\b匹配单词的开始或结束
^匹配字符串的开始
$匹配字符串的结束
字符转义

查找元字符本身,例如查找 .* ,就会出现问题。
这里无法指定它们,因为它们会被解释成别的意思。这里需要使用 \ 来取消这些字符的特殊意义。因此,应该使用 \.\*。当然,查找 \ 本身,也得用 \\

限定符
字符说明
*重复零次或多次
+重复一次或多次
?重复零次或一次
{n}重复 n 次
{n, }重复 n 次或多次
{n, m}重复 n 到 m 次

*、+ 和 ? 限定符都是贪婪的,因为它们会尽可能的匹配文字,只有在它们的后面加上 ? 就可以实现非贪婪或最小匹配
例如,搜索 HTML 文档,以查找括在 H1 标记内的章节标题。文档如下:

<h1>Introduction to Regular Expressions</h1>

匹配从小于符号(<)开始到关闭 h1 标记的大于符号(>)之间的所有内容,表达式如下

<.*>

匹配开始的 h1 标记,下面是 ”非贪心“ 表达式

<.*?>
反义字符
字符说明
\W匹配任意不是字母,数字,下划线,汉字的字符
\S匹配任意不是空白符的字符
\D匹配任意非数字的字符
\B匹配不是单词开头或结束的位置
[^x]匹配除 x 以外的任意字符
反向引用

使用小括号指定一个子表达式后,匹配这个子表达式的文本可以在表达式或其他程序中进一步处理。默认情况下,每个分组会自动拥有一个组号,但(?:exp) 这样的语法会剥夺一个分组对组号分配的参与权。分组 0 对应整个正则表达式。

常用的分组语法

分类符号说明
捕获(exp)匹配 exp,并捕获文本到自动命名的组里
(?exp)匹配 exp,并捕获文本到名称为 name 的组里,也可以写成(?'name’exp)
(?:exp)匹配 exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言(?=exp)匹配 exp 前面的位置
(?<=exp) 匹配 exp 后面的位置
(?!exp) 匹配后面跟的不是 exp 的位置
(?<!exp)匹配前面不是 exp 的位置
注释(?#comment)用于提供注释让人阅读

零宽断言

(?=exp) 也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式 exp。比如 \b\w+(?=ing\b),匹配以 ing 结尾的单词的前面部分(除了 ing 以外的部分)。如查找 I’m singing,它会匹配 sing。

(?<=exp) 也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式 exp 。例如 (?<=\bre)\w+\b 会匹配以 re 开头的单词的后半部分(除了 re 以外的部分),例如在查找 reading a book 时,它会匹配 ading 。

负向零度断言

(?!exp) 零宽度负预测先行断言,断言位置的后面不能匹配表达式 exp。例如: \d{3}(?\d),能匹配三位数字,而且三维数字的后面不能是数字;\b((?!abc)\w)+\b 匹配不包含连续字符串 abc 的单词。

(?<!exp) 零宽度负回顾后发断言,断言位置的前面不能匹配表达式 exp。例如:(?<![a-z])\d{7} 匹配前面不是小写字母的七位数字。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值