小菜鸡的学习笔记---<正则表达式(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],或者 ...
随机推荐
- 关于virtio_net网卡命名的小问题
最近看了一个小问题,涉及到一致性网络设备命名(Consistent Network Device Naming),在此记录一下. 系统是 4.18.0-240.el8.x86_64,centos 8. ...
- Laravel框架中文件所在的位置
- 【lwip】005-lwip内核框架剖析
目录 前言 5.1 lwip初始化 5.2 内核超时 5.2.1 内核超时机制 5.2.2 周期定时机制 5.2.3 内核超时链表数据结构 5.2.4 内核超时初始化 5.2.6 超时的溢出处理 5. ...
- 02_Linux基础-文件系统层次结构-提示符-进程-命令格式-隐藏文件-通配符-绝对相对路径-{1..100}-ls-mkdir-其他基础命令
02_Linux基础-ls-mkdir-cd-pwd-man-useradd-su-rm-tree-tab-passwd-w-ssh-touch-date-stat-cp-mv-du-文件系统层次结构 ...
- [Python]-pandas模块-CSV文件读写
Pandas 即Python Data Analysis Library,是为了解决数据分析而创建的第三方工具,它不仅提供了丰富的数据模型,而且支持多种文件格式处理,包括CSV.HDF5.HTML 等 ...
- Openstack Neutron:二层技术和实现
目录 - 二层的实现 - 1.本地联通与隔离: - Linux bridge实现方式: - local - Flat - VLAN - VXLAN - Open vswitch实现方式 - local ...
- vscode-jupyter快捷键
运行本单元 ctrl + enter 运行本单元,新建一个单元 shift + enter 运行本单元,在其下方新建一个单元 alt + enter 在上方插入一个新单元 a 在下方插入新单元 b 复 ...
- Kubernetes(K8S)特性有哪些?
Kubernetes简介 Kubernetes是一个开源的,用于管理云平台中做个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单且高效,Kubernetes提供了应用部署,规划 ...
- 使用 Elastic 技术栈构建 K8S 全栈监控 -2: 用 Metricbeat 对 Kubernetes 集群进行监控
文章转载自:https://www.qikqiak.com/post/k8s-monitor-use-elastic-stack-2/ 操作步骤 git clone https://github.co ...
- Elasticsearch:Smart Chinese Analysis plugin
Smart Chinese Analysis插件将Lucene的Smart Chinese分析模块集成到Elasticsearch中,用于分析中文或中英文混合文本. 支持的分析器在大型训练语料库上使用 ...