小菜鸡的学习笔记---<正则表达式(1)>
正则表达式学习笔记(1)
(纯新手学习笔记,大佬绕路 QAQ)
一.简介
正则表达式就是一种文本模式用来匹配一系列满足特定条件的字符串,可以对比一下数学里面的表达式,比如我们要用一个表达式表示一串数字1,4,7,10,13,16......,数学表达式就是3x+1,同样的如果我们要表示一串邮箱也可以用一个正则表达式来表示^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$,这个表达式就能表示如123as@qq.com,yweiji@outlook.com等等格式的字符串。正则表达式有很多作用,比如说刚刚提到的邮箱格式,这个可以用来规范用户的输入,有时候只能让用户输入纯数字或者指定格式的数据,那么就可以用正则表达式来和用户的输入进行比较,只有满足这个表达式才能成功提交;然后就是可以快速匹配文档中所有特定信息,如果要替换文档中所有的像usc-1234,usc-zyui,usc-12in......这种数据就可以用一个正则表达式把文档中所有对应字符串进行修改,而不用一个一个去修改(因为只有前面的几个字母是相同的);同样也可以快速在海量的数据中提取所需的满足特定要求的所有数据。
二.正则表达式语法及实例
[字母数字等] 匹配中括号里面包含的所有字符,比如[abcxyz]就匹配这六个字母,一个字符串中appleyes这个字符串中满足前面那个正则表达式的字符就是ay
[^数据] 加上^这个符号就是取反的意思,相当于不匹配[数据]所表示的那些字符,比如[^abcxyz]就是匹配除这六个字母以外的字符,appleyes满足的字符就是pplees
[1-9a-z]连字符就是表示一整个区间的所有数据,比如这个正则表达式就是匹配1,2,3,4...,9和a,b,c,...,z的所有字符,GoodJob123满足的就是oodob123
\w 匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
\n 匹配匹配一个换行符,\f 匹配一个换页符,\r 匹配一个回车符,\t 匹配一个制表符,\v匹配一个垂直制表符,\s匹配所有空白符,如\n,\t,\r等等,\S匹配所有非空白符就是除了\t,\r这些以外的所有字符,包括数字字母符号等.
$ 匹配字符串结尾,可能有时候要求用户输入必须以com结尾就可以在最后加上com$
()小括号包围的算一个整体,也就是一个子表达式方便调用
* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。
. 一个点号就表示除了\n和\r外的所有字符。
[] 标记一个中括号表达式,比如前面的[a-z],[1-9]等等需要用到中括号。
? 匹配前面的子表达式零次或一次。
\ 对相应字符进行转义,将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
^ 前面提到在方括号中用表示取反,在外面使用^这个符号表示匹配字符串开头,和$符号相对应。
{ } 表示前面的字符或者子表达式可以出现多少次,比如说a{2}表示必须匹配2个a,a{2,}表示可以匹配2个以上的a,(ab){1,3}表示可以出现1-3个连续的ab。
| 两项之间的选择其中一个。
三.特殊字符分析
1.贪婪与非贪婪匹配
刚刚介绍的有几个字符会有一些共同点,比如*和+,这两个符号分别是匹配零次或更多的字符以及一次或更多的字符,都是尽可能地匹配所有符合要求的字符,但是有时候我们不需要匹配所有满足要求的字符,这时我们可以结合?实现最小匹配,也称为非贪婪匹配。举个例子有一个字符串为<b>123>aa>123>a<c>,我们用这样一个正则表达式去匹配,<.*>,<匹配第一个,.号会尽可能的去匹配所有字符,直到最后一个>符号,如果在<c>后面还有一个>符号那么.*就会去匹配<c>和最后一个>之间的满足要求的字符,也就是在满足正则表达式要求的情况下尽可能多的去匹配所有字符。但如果我们想要尽可能短的获得符合要求的字符,比如我们只需要<b>这么一个标签,那么就是让符合要求的字符数量尽可能少,我们就在*号或者+后面加上一个?号,这个?仅表示非贪婪尽可能短的匹配,比如<.*?>来匹配前面的字符串得到的匹配结果就是<b>以及<c>,可以根据需要取舍最后的结果。
2.定位符
前面提到$ 匹配字符串结尾,^这个符号表示匹配字符串开头,同样还有\b匹配一个单词边界,即字与空格间的位置,\B表示非单词边界匹配,我们要求用户必须以大写字母开头并且数字结尾就可以使用下面这个表达式^[A-Z].*[0-9]$。对于\b,举个例子这样一个字符串Hello World,正则为\bHe我们就匹配到He,如果正则为\bell那么就匹配不到任何字符,以为ell在单词的中间部分,并不是单词的边界,并且\b的位置也很重要,如果在前面就是从边界向后匹配,如果在后面就是从边界也就是空格处向后匹配,比如llo\b就能匹配,而\bllo就不行,因为llo的左侧才是空格边界。\B自然而然就和前面的\b相对应,\b匹配边上的字符,\B就是匹配单词中间的字符,比如\Bell。并且\B的位置既可以在前面也可以在后面。
3.圆括号()
进行分组,把里面的内容当作整体处理,进行选择,可以把需要进行选择的数据放在圆括号里面并用|隔开,此外圆括号里面的内容作为子表达式还会被存储下来,可以通过相应的方法调用,不但可以得到最后的值也可以分别得到各个子表达式的值,如果我们不需要子表达式的值只要最终结果那么可以在圆括号里面加上?:比如(?:[A-Z]|[1-9])。
4.?=、?<=、?!、?<! 的使用
abc(?=123) 先匹配到123,然后再去匹配和123前面连接的abc,比如这样一个字符串aabc12354j,最后匹配得到的结果就是abc,并且abc和123必须是紧接着的。(?<=123)abc和前面那个相反,这个是匹配123后面紧接着的abc,abc(?!123),可以注意到这个!号,表示否的意思,也就是匹配字符串中的abc,并且匹配到的abc后面跟着的不能是123。(?<123)abc,这个匹配abc并且前面接着的不是123。
5.反向引用
前面提到小括号会把他的子表达式的值给存储下来,既然是存储那么我们自然也能进行访问,可以通过\n的方式进行访问,n表示第几个,这个功能可以查找文本中两个相同的相邻单词的匹配项,就是利用子表达式的值会被存储这个效果把下一个匹配的单词和前一个相比较,看是否相同。
小菜鸡的学习笔记---<正则表达式(1)>的更多相关文章
- [Python学习笔记]正则表达式总结
常用缩写字符及其含义表格查询 缩写字符分类 含义 \d 0-9的任意数字 \D 除0-9的数字以外的任何字符 \w 任何字母.数字或下划线字符(可以认为是匹配"单词"字符) \W ...
- Python学习笔记——正则表达式入门
# 本文对正则知识不做详细解释,仅作入门级的正则知识目录. 正则表达式的强大早有耳闻,大一时参加一次选拔考试,题目就是用做个HTML解析器,正则的优势表现得淋漓尽致.题外话不多讲,直接上干货: 1. ...
- JavaScript学习笔记-正则表达式(RegExp对象)
正则表达式(RegExp对象) 1.正则表达式字面量,在脚本加载后编译.若你的正则表达式是常量,使用这种方式可以获得更好的性能,重复使用时不会重新编译: 2.使用构造函数创建的RegExp,提供了 ...
- JavaScript学习笔记-正则表达式(语法篇)
正则表达式的模式规则是由一个字符系列组成的,包括所有字母和数字在内;大多数的字符(所有字母和数字)都是按字符的直接量来描述带匹配的字符;一些具有特殊语义的字符按照其特殊语义来进行匹配,有些字符需要通过 ...
- JavaScript学习笔记- 正则表达式常用字符集及方法
正则表达式修饰符(修饰符 可以在全局搜索中不区分大小写) i(ignoreCase)执行对大小写不敏感的匹配 g (global) 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) m( ...
- Shell学习笔记 - 正则表达式
一.正则表达式是什么? 正则表达式是用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割.匹配.查找及替换操作. 二.正则表达式与通配符 1. 正则表达式 用来在文件中匹配符合条件的字 ...
- Python学习笔记——正则表达式
今天把之前学的正则表达式好好总结总结. 一.元字符 . : .表示可以匹配任意一个字符 \d : \d表示可以匹配任意一个数字 \D : \D表示可以匹配任意一个非数字 \s : \s表示 ...
- Scala学习笔记--正则表达式基础知识、如何在scala内使用
正则表达式语法:https://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx 基础知识:正则表达式30分钟入门教程 http://www. ...
- PERL学习笔记---正则表达式的应用
使用m//匹配 //这是m//(模式匹配)的一种简写.同qw//操作一样,可以使用任何成对的分隔符.因此,可以使用m(fred), m<fred>, m{fred}, m[fred],或者 ...
随机推荐
- 编写X86的ShellCode
ShellCode 定义 ShellCode是不依赖环境,放到任何地方都能够执行的机器码 编写ShellCode的方式有两种,分别是用编程语言编写或者用ShellCode生成器自动生成 ShellCo ...
- 46th ECfinal 游记
Day0 坐高铁坐了七小时从北戴河到西安,但第一次线下赛,来的路上还是很激动的 路上看到华山,下次来西安一定去爬 刚下高铁站遇到了一个不知道干啥的xjj xjj:可以占用您一点时间吗?谢谢了. 我:不 ...
- Aoac唤醒的软件方案
Aoac唤醒 这篇文章包含了Win10下的Aoac唤醒和Win11下的Aoac唤醒的不同地方,在结尾处: 从Win10时代开始,通过软件来唤醒机器是一个很常见的事情了,但是很少有文档去将如何通过AOA ...
- manim
from manim import * #导入manim命名空间 #这是一个最基本的manim结构,类名叫做BaseFrame,传入一个场景Scene,并且包含一个construct方法,传入self ...
- 并发编程Bug起源:可见性、有序性和原子性问题
以前古老的DOS操作系统,是单进行的系统.系统每次只能做一件事情,完成了一个任务才能继续下一个任务.每次只能做一件事情,比如在听歌的时候不能打开网页.所有的任务操作都按照串行的方式依次执行. 这类服务 ...
- Python图像处理丨认识图像锐化和边缘提取的4个算子
摘要:图像锐化和边缘提取技术可以消除图像中的噪声,提取图像信息中用来表征图像的一些变量,为图像识别提供基础. 本文分享自华为云社区<[Python图像处理] 十七.图像锐化与边缘检测之Rober ...
- Mysql 实现 向上递归查找父节点并返回树结构
需求:通过mysql 8.0以下版本实现,一个人多角色id,一个角色对应某个节点menu_id,根节点的父节点存储为NULL, 向上递归查找父节点并返回树结构. 如果只有叶子,剔除掉; 如果只有根,只 ...
- 人脸识别、活体检测(眨眼、摇头、张嘴动作)clmtrackr
人脸识别.活体检测(眨眼.摇头.张嘴动作)项目总结 项目需求 / 步骤实现描述: 1.申请摄像头权限,开始识别面部信息.同时开始录像 : 2.随机顺序生成面部检验动作: 3.并开始倒计时,需10s内完 ...
- 使用Portainer管理其他主机的docker应用有两种方式
官方文档地址:https://docs.portainer.io/v/ce-2.9/admin/environments/add/docker 第一种方式 是在其他主机的docker 启动中放开237 ...
- Grafana的基本概念
Grafana基本概念 首先Grafana是一个通用的可视化工具.'通用'意味着Grafana不仅仅适用于展示Prometheus下的监控数据,也同样适用于一些其他的数据可视化需求.在开始使用Graf ...