2019独角兽企业重金招聘Python工程师标准>>>

[TOC]


开发过程中,很多人止于正则,搜于网络。正则虽小,意义颇大。几乎所有开发语言都提供支持, 它始于仿生学(神经元描述)符号描述,崛起于各操作系统,附生于编辑器中,欣欣向荣,如日中天。

场景

  • 千分位

某大厂有这么一道题目,具有开放性。 大数字以千分位隔开即生活场景中的账户金额,怎么做? 仁者见仁智者见智,办法总比问题多,然而一条简单正则轻松解决。

正则表达式:/(\d{1,3})(?=(\d{3})+$)/g

如:

"1111234334".replace(/(\d{1,3})(?=(\d{3})+$)/g,"$1,")
  • 支付弱密码校验

很多场景下,用户会设置简单易记密码,为了避免用户密码被撞库,被不法分子利用,需要在设置时校验,提示用户。

如123456使用正则校验

  /(0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)){5}/

目的或意义

对字符串进行过滤筛选匹配,得到预期的值或效果

概念

对字符串和特殊符号操作的逻辑公式

应用场景

表单校验,条件搜索查询,数据替换等

linux 里面很多地方都用到

sed 's/pattern/replacement/flag' file
awk '/pattern/program' file

正向预查

在任何匹配 pattern 的字符串开始处匹配查找字符串。

预查是非捕获特性,JAVASCRIPT不支持反向预查

正向正预查

?:

    window(?:10|7) 可以匹配window10 或 window7 ``` javascript /window(?:10|7)/.test("window10") //true

匹配过程是如何的呢?

字符串从左到右,游标起始于字符串开始部分的左侧,正则表达式的w与字符串w匹配,匹配成功后,游标移动到w右侧,然后匹配i,匹配成功后,游标继续游走,以此类推直到游标停留到字符串末尾

?=

   /window(?=7)/.test("window7") //true

匹配过程又如何呢?

游标由字符串的最左侧开始,正则表达式以此匹配直到window的右侧,此时游标停留,正则继续匹配,当匹配到7的时候,匹配成功。由于游标停留在7的左侧(即w的右侧),因此得到的匹配结果是window而不是window7

正向负预查

?!

/window(?!7)/.test("windowXP") //true

此时的匹配过程又该如何 跟上面?=类似,不同的是XP与正则中的7不对应时为匹配成功

反向预查

在任何不匹配pattern 的字符串开始处匹配查找字符串。

反向正预查

/(?<=best)pay/  匹配bestpay

反向负预查

/(?<!best)pay/  匹配alipay

非贪婪模式 VS 贪婪模式

  • 贪婪模式

例如:

javascript /ab*c/.test("abbbc") //匹配abbbc

过程如下:

游标从a左侧开始,正则与字符串匹配到ab后,b继续与b匹配,直到c与b匹配,发现不能匹配,于是,选用备选路线,选用用字符串c与正则c匹配,匹配上游标前进到c的右侧全部匹配完成

  • 非贪婪模式

例如:


javascript /ab*?c/.test("ac") //匹配ac

正则中? 是优先考虑的

过程如下:

游标从字符串"ac"中a的左侧开始,正则a与字符a匹配上,游标前进到a的右侧,此时模式中的"b*?" 与字符"c"匹配不上,于是,选用备用方案,正则会用"c" 与跟 字符串的"c"匹配,匹配上后,游标移动到末尾,因此匹配的值是ac

执行过程

基于PCRE的正则引擎有一个特点:递归和回溯

递归


javascript /^c*?d(?=e)/.test("cde") //true, 匹配cd
  1. ^表示起始位置0(即字符串cd的左侧)

$表示字符串末尾

  1. "cd"中的c与正则中的c*?进行匹配,游标继续前进,
  2. "cd"中的d与c*?匹配不上时,选用备选路线
  3. "cd"中的d与正则中的d对比并匹配上
  4. ?=e不占用位置但是要校验e值的存在(即游标在d右侧时,"cde"中e与?=e匹配上,游标不会移动)

类似?=e这种零位占用还有^,$

回溯


javascript /tf??a/.test("tea") //false

过程如下:

  1. 由字符串"tea"左侧开始,"tea" 的t 与 正则t匹配
  2. 忽略f?? 直接匹配正则a,"tea"的"e" 与 正则表达式中"a" 对比,匹配失败
  3. 正则表达式回溯到f??, 此时“tea”中的“e” 与正则表达式中“f??“对比,匹配失败
  4. 正则模式继续回退,此时正则表达式中t与字符串中”e“比较,匹配失败

对于??,是可优先忽略的

符号的运算优先级

优先级从高到低

操作符号 描述
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter 位置和顺序

金无足赤人无完人

任何东西都得以辩证角度看待,凡是都有好有坏。 虽然正则可以作为一种途径实现业务需求,但是,由于自身的特性(递归,回溯等)会导致执行效果在某些场景下匹配速度较慢,还不如直接使用字符串的搜索。

正则常用符号及含义

普通字符

非打印字符

字符 含义 备注
\f 换页符 等价于 \x0c 和 \cL
\cx 匹配由x指明的控制字符 \cM 匹配一个 Control-M 或回车符
\n 换行符 等价于 \x0a 和 \cJ
\r 匹配一个回车符。 等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。 等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。 等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。 等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。 等价于 \x0b 和 \cK。

特殊字符

字符 含义 备注
\$ 匹配输入字符串的结尾位置。 如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。
( ) 标记一个子表达式的开始和结束位置。 子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
* 匹配前面的子表达式零次或多次。 要匹配 * 字符,请使用 *。
+ 匹配前面的子表达式一次或多次。 要匹配 + 字符,请使用 +。
. 匹配除换行符 \n之外的任何单字符。 要匹配 .,请使用 \。
[ 标记一个中括号表达式的开始。 要匹配 [,请使用 [。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。 要匹配 ? 字符,请使用 \?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。 例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\’ 匹配 “\”,而 ‘(’ 则匹配 “(”。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。 要匹配 ^ 字符本身,请使用 \^。
{ 标记限定符表达式的开始。 要匹配 {,请使用 \{。
指明两项之间的一个选择。

定位符号

用来描述字符串或单词的边界

  • ^ > 字符串以何元素开始
  • $ > 字符串以什么结束
  • \b > 描述单词以何为边界
  • \B > 描述单词非边界情况

限定符号

字符 含义 备注
* 匹配前面的子表达式零次或多次。 * 等价于{0,}。
+ 匹配前面的子表达式一次或多次。 + 等价于 {1,}。
? 匹配前面的子表达式零次或一次。 ? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。 例如,’o{2}’ 不能匹配 “to” 中的 ‘o’,但是能匹配 “tooth” 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。 例如,’o{2,}’ 不能匹配 “to” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。

字符簇

字符 含义 备注
\d 匹配一个数字字符。 等价于 [0-9]。
\D 匹配一个非数字字符。 等价于 [^0-9]。
\w 匹配包括下划线的任何单词字符。 等价于’[A-Za-z0-9_]’。
\W 匹配任何非单词字符。 等价于 ‘[^A-Za-z0-9_]’。
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。 例如,’(.)\1′ 匹配两个连续的相同字符。

作者简介:

就职于甜橙金融信息技术部,负责前端开发工作,先后任职携程,平安等公司的前端开发工程师职位,喜欢研究新的技术,服务于业务需求,熟练运用Linux/Unix系统命令,以终端为载体,快速执行操作。

转载于:https://my.oschina.net/u/861562/blog/1823451

正则表达式--内功心法相关推荐

  1. 通过正则表达式校验手机号码,拿走即用!

    校验手机号码 2021/01/06更新,电信新增了191号段 1. 单纯校验长度 2.正则表达式校验数字 3.正则表达式校验是否是大陆号码 4.正则表达式校验是否是香港号码 //校验长度private ...

  2. Linux shell 学习笔记(15)— shell 正则表达式

    1. 定义 BRE 模式 1.1 纯文本 第一条原则就是:正则表达式模式都区分大小写.这意味着它们只会匹配大小写也相符的模式. $ echo "This is a test" | ...

  3. re2正则表达式匹配引擎的c接口版本cre2的中文使用手册

    前言 re2 官方地址: https://github.com/google/re2 cre2 官方地址: https://github.com/marcomaggi/cre2 1 基本类型定义 不透 ...

  4. 正则表达式(括号)、[中括号]、{大括号}的区别小结

    正则表达式(括号).[中括号].{大括号}的区别小结 </h1><div class="clear"></div><div class=& ...

  5. Python中正则表达式用法 重点格式以这个为准_首看_各种问题

    20210811 https://www.jb51.net/article/101258.htm 一.惰性模式的概念: 此模式和贪婪模式恰好相反,它尽可能少的匹配字符以满足正则表达式即可,例如: va ...

  6. 正则语法完全正则表达式手册_语法格式重点

    20211202 https://blog.csdn.net/lc11535/article/details/103266263 该表达式打开re.U(re.UNICODE)标志. python –& ...

  7. 正则表达式 - 语法

    正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等. 例如: r ...

  8. 正则表达式中的\.表示什么意思

    \ 这是引用符,用来将这里列出的这些元字符当作普通的字符来进行匹配.例如正则表达式\$被用来匹配美元符号,而不是行尾,类似的,正则表达式\.用来匹配点字符,而不是任何字符的通配符.

  9. ?:在正则表达式中什么意思

    "?:"非获取匹配,匹配冒号后的内容但不获取匹配结果,不进行存储供以后使用. 单独的"?":匹配前面的子表达式零次或一次. 当"?"紧跟在任 ...

最新文章

  1. 银行柜台基金买卖现长龙 业内支招宜用新方式
  2. 查看Linux系统架构类型的5条常用命令
  3. js 解除网页右键菜单被禁用
  4. 动态规划--Leetcode63.不同路径二
  5. 纯净微擎框架 V 2.5.7 稳定运营版 免验证/去授权/防拉黑/支持本地模块安装源码
  6. STA 137 Topics covered this week
  7. MTK驱动开发(44)---如何对GPS下达清除辅助资讯的command
  8. 三只松鼠现“两只老鼠”:卖废纸箱发家致富??
  9. Java基础学习总结(19)——Java环境变量配置
  10. 数学建模-2.优劣解距离法Topisis模型
  11. 软工实践第一次作业-自我审视和规划
  12. 如何在终端窗口中在Linux中创建文件?
  13. JavaScript浏览器对象Window对象常用方法(3)
  14. ceph对接openstack环境
  15. sublime快捷键生成html5基本模板
  16. AutoRunner录制过程中发现对象录制不了
  17. QtcpSocket readyRead 粘包解法
  18. 只需三步!查看笔记本电脑连接的WiFi密码
  19. android app 适应不同大小屏幕_Android自适应屏幕大小和布局
  20. IOS7.1.2越狱手工美化(字体,状态栏等资源) CSDN

热门文章

  1. [Java] 蓝桥杯ALGO-61 算法训练 奇偶判断
  2. 蓝桥杯 ADV-91 算法提高 素数判断
  3. python的init方法在哪个模块_Python学习笔记(九)——Python _init_特殊方法和模块...
  4. python怎么在图片上写字_Python在图片中添加文字的两种方法
  5. java获取redis中各种数据类型key对应的value代码简单封装
  6. SQL语句常用优化技巧
  7. nginx历史版本下载链接
  8. day23 内置函数,匿名函数,递归
  9. 基于rhel7.2的mysql5.7.13安装与配置
  10. IO多路复用的机制:select、poll、epoll