小菜鸡的学习笔记---<正则表达式(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],或者 ...
随机推荐
- docker启动失败问题
内核3.10,systemctl start docker 被阻塞,没有返回,查看状态为启动中. 某兄弟机器安装docker之后,发现systemctl start docker的时候阻塞,由于排查走 ...
- 好好回答下 TCP 和 UDP 的区别
写了这么多篇关于 TCP 和 UDP 的文章,还没有好好聊过这两个协议的区别,这篇文章我们就来开诚布公的谈一谈. 关于 TCP 和 UDP ,想必大家都看过一张这样的图. 有一个小姑娘在对着瓶口慢慢的 ...
- 未完待续【java】JavaEE学习路线总览
这个博客会详细介绍各种技术的知识点,从零基础到入门,充当引路的作用. 同时也会发布一些Swift语言.c#语言.Xcode开发的学习笔记.一些阅读的笔记(部分读书笔记无法发布). 目前1-43的Jav ...
- Javaweb__Jquery
今日内容 1. JQuery 基础: 1. 概念 2. 快速入门 3. JQuery对象和JS对象区别与转换 4. 选择器 5. DOM操作 6. 案例 JQuery 基础: 1. 概念: 一个Jav ...
- k8s 网络持久化存储之StorageClass(如何一步步实现动态持久化存储)
StorageClass的作用: 创建pv时,先要创建各种固定大小的PV,而这些PV都是手动创建的,当业务量上来时,需要创建很多的PV,过程非常麻烦. 而且开发人员在申请PVC资源时,还不一定有匹配条 ...
- KingbaseES R6集群归档备份故障分析解决案例
案例说明: 在使用ps工具查看主库进程,发现主库'archiver'进程失败,检查sys_log日志可以发现归档失败的信息.通过sys_log日志提取归档语句手工执行归档操作,提示"当前数据 ...
- 走进Redis-扯扯集群
集群 为什么需要切片集群 已经有了管理主从集群的哨兵,为什么还需要推出切片集群呢?我认为有两个比较重要的原因: 当 Redis 上的数据一直累积的话,Redis 占用的内存会越来越大,如果开启了持久化 ...
- docker学习笔记一-docker安装与卸载
环境查看 # 1 查询当前centOS的版本,官方要求版本为7以上 uname -r 查询系统内核 cat /etc/os-release 系统版本 安装 # 1.卸载旧版本 yum remove d ...
- 创建多个节点的集群 - Elastic Stack 8.0
文章转载自:https://mp.weixin.qq.com/s/k6u9Q2nebW9qgZMghQwJng 详述如何安装3个节点的 Elasticsearch 集群.我将使用 Docker 来进行 ...
- filebeat知识点
在Filebeat的根目录下,有一个叫做filebeat.yml的文件. filebeat.inputs: - type: log enabled: true paths: - ./sample.lo ...