正则表达式学习笔记(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)>的更多相关文章

  1. [Python学习笔记]正则表达式总结

    常用缩写字符及其含义表格查询 缩写字符分类 含义 \d 0-9的任意数字 \D 除0-9的数字以外的任何字符 \w 任何字母.数字或下划线字符(可以认为是匹配"单词"字符) \W ...

  2. Python学习笔记——正则表达式入门

    # 本文对正则知识不做详细解释,仅作入门级的正则知识目录. 正则表达式的强大早有耳闻,大一时参加一次选拔考试,题目就是用做个HTML解析器,正则的优势表现得淋漓尽致.题外话不多讲,直接上干货: 1. ...

  3. JavaScript学习笔记-正则表达式(RegExp对象)

    正则表达式(RegExp对象)   1.正则表达式字面量,在脚本加载后编译.若你的正则表达式是常量,使用这种方式可以获得更好的性能,重复使用时不会重新编译: 2.使用构造函数创建的RegExp,提供了 ...

  4. JavaScript学习笔记-正则表达式(语法篇)

    正则表达式的模式规则是由一个字符系列组成的,包括所有字母和数字在内;大多数的字符(所有字母和数字)都是按字符的直接量来描述带匹配的字符;一些具有特殊语义的字符按照其特殊语义来进行匹配,有些字符需要通过 ...

  5. JavaScript学习笔记- 正则表达式常用字符集及方法

    正则表达式修饰符(修饰符 可以在全局搜索中不区分大小写) i(ignoreCase)执行对大小写不敏感的匹配 g (global)     执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) m( ...

  6. Shell学习笔记 - 正则表达式

    一.正则表达式是什么? 正则表达式是用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割.匹配.查找及替换操作. 二.正则表达式与通配符 1. 正则表达式 用来在文件中匹配符合条件的字 ...

  7. Python学习笔记——正则表达式

    今天把之前学的正则表达式好好总结总结. 一.元字符 . :  .表示可以匹配任意一个字符 \d  :  \d表示可以匹配任意一个数字 \D  : \D表示可以匹配任意一个非数字 \s  :  \s表示 ...

  8. Scala学习笔记--正则表达式基础知识、如何在scala内使用

    正则表达式语法:https://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx 基础知识:正则表达式30分钟入门教程 http://www. ...

  9. PERL学习笔记---正则表达式的应用

    使用m//匹配 //这是m//(模式匹配)的一种简写.同qw//操作一样,可以使用任何成对的分隔符.因此,可以使用m(fred), m<fred>, m{fred}, m[fred],或者 ...

随机推荐

  1. 万物皆可集成系列:低代码释放用友U8+深度价值(2)—数据拓展应用

    在上一篇内容我们介绍了如何利用低代码开发套件实现低代码应用与U8+系统的对接集成,本次给大家带来的是如何将用友U8+系统中的数据进行价值扩展和实际应用. 我们以生产物料齐套分析为例来说明如何利用低代码 ...

  2. 【java】学习路径28-Java集合类知识点总结+练习题(去重)

    Java集合 1.集合和数组的区别 (1)  集合可以改变长度 (2)  数组长度不可变 2.ArrayList (1)  add addAll (2)  remove removeAll (3)   ...

  3. 【短道速滑九】仿halcon中gauss_filter小半径高斯模糊优化的实现

    通常,我们谈的高斯模糊,都知道其是可以行列分离的算法,现在也有着各种优化算法实现,而且其速度基本是和参数大小无关的.但是,在我们实际的应用中,我们可能会发现,有至少50%以上的场景中,我们并不需要大半 ...

  4. 【读书笔记】C#高级编程 第五章 泛型

    (一)泛型概述 泛型不仅是C#编程语言的一部分,而且与程序集中的IL代码紧密地集成.泛型不仅是C#语言的一种结构,而且是CLR定义的.有了泛型就可以创建独立于被包含类型的类和方法了. 1.性能 泛型的 ...

  5. Dart 2.18 正式发布

    互操作性增强.平台特定的网络组件.优化类型推断,以及空安全语言里程碑的近期更新 文/ Michael Thomsen, Google Flutter & Dart 产品经理 Dart 2.18 ...

  6. 为开源提 PR

    PR 可让你在 GitHub 上向他人告知你已经推送到存储库中分支的更改. 在 PR 打开后,你可以与协作者讨论并审查潜在更改,在更改合并到基本分支之前添加跟进提交. 为什么 PR 使用 PR 的主要 ...

  7. .NET Core Web APi类库如何内嵌运行?

    话题 我们知道在.NET Framework中可以嵌入运行Web APi,那么在.NET Core(.NET 6+称之为.NET)中如何内嵌运行Web Api呢,在实际项目中这种场景非常常见,那么我们 ...

  8. 【学习笔记】GBDT算法和XGBoost

    前言 这一篇内容我学了足足有五个小时,不仅仅是因为内容难以理解, 更是因为前面CART和提升树的概念和算法本质没有深刻理解,基本功不够就总是导致自己的理解会相互在脑子里打架,现在再回过头来,打算好好总 ...

  9. 车辆稳定性辅助(VSA)系统

    当车辆转弯大于或小于预期时,VSA有助于在转弯时稳定车辆. 同时还有助于在湿滑路面上保持牵引力. VSA 打开和关闭 禁用: 请长按按钮直至听到哔的一声.VSA 关闭指示灯点亮. 恢复: 按下按钮直至 ...

  10. 通过 Traefik 使用 Kubernetes Service APIs 进行流量路由 (http,https,金丝雀发布)

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247490229&idx=1&sn=ca817054 ...