专栏首页Golang语言社区十分钟学会正则表达式

十分钟学会正则表达式

作者:RyuGou 链接:https://www.jianshu.com/p/89fec1accae5 来源:简书

正则表达式用处挺广的,主要用于处理字符串。

正则引擎

想要在计算机语言中使用正则表达式,那么这门计算机语言必须要利用正则引擎去实现相应的正则库。主要的正则引擎分为以下两类:

  • DFA 确定性的状态机。不使用"回溯",效率高,但是支持的正则表达式语法有限。
  • NFA 非确定性状态机。构造简单,使用"回溯算法",支持大多数的正则语法,是目前使用最广泛的正则引擎,大多数计算机语言例如Java、PHP、Ruby、Python等都是使用的NFA正则引擎。

语言实现

不同的语言对正则的实现不同,暴露出来的方法也不同,但方法的作用其实都是大同小异,这里用PHP语言做例子。

匹配字符串

  • preg_match(string $pattern, string $subject[, array &$matches]) 使用很频繁。函数返回匹配到的结果的次数。只匹配一次,参数 matches只返回第一条结果。
  • preg_match_all(string $pattern, string $subject[, array &$matches]) 使用很频繁。函数返回匹配到的结果的次数。参数matches只返回所有结果。

替换字符串或数组

  • preg_replace($pattern, $replacement, $subject) 返回匹配过滤后的字符串或者数组。
  • preg_filter($pattern, $replacement, $subject)返回匹配过滤后的字符串或者数组。

这俩函数,都可以替换字符串,在字符串替换中,俩函数用法完全一致。

这俩函数,不仅可以替换字符串,还可以替换数组!在替换数组的时候,pre_filter会过滤掉没有匹配到的内容,而pre_replace不会,这就是他俩的唯一区别。

替换数组

  • preg_grep(string $pattern, array $input[, int flags = 0]) 返回匹配模式的数组条目。阉割版本的preg_filter

正则运算符转义

对一个字符串中的正则表达式的运算符:". \ + * ? [ ] ^ $ ( ) { } = ! < > | : -"进行转义,转义成非正则表达式的运算符,否则正则表达式会认为其为运算符。

  • preg_quote(string $str[, string $delimiter = null ]) 转义正则表达式字符串。返回转义后的字符串。

正则表达式语法

你可以把正则表达式当做一门简单的语言来看,但是它的语法显然比一般的计算机语言要简单一些。

界定符

指定正则表达式的开始和结束,可以当成是计算机语言中的大括号{}。一般有三种表现方式:

  • 斜杠。例如/[0-9]/。这是最常用的方式,在PHP中,推荐使用这种方式。
  • 井号。例如#[0-9]
  • 大括号。例如{[0-9]}。在正则表达式中,大括号还有其他作用,所以这种方式不推荐使用。

原子

正则表达式中最小的匹配单位,其实就是字符串中的字符。主要分为两大类:

可见原子:

肉眼能够看见的字符。

  • 标点符号。例如:”_ ? . ;,“等等
  • 英文字母数字。例如:”a-z,A-Z,0-9“
  • 汉字、日文、阿拉伯文等其他语言文字
  • 数理化公式符号。例如:"∩ ∪ π Ω "等等
  • 其他可见字符

由于某些字符在正则表达式中属于特殊字符,那么在书写这类特殊字符的时候,应该注意要加上反斜杠\,例如如果匹配^直接写/^/肯定不行,如果加上反斜杠,就可以了。\^

不可见原子:

肉眼看不到的。

  • 空格。
  • 换行符\n
  • 回车符\r
  • 制表符\t。其实就是按一下键盘tab键出来的
  • 其他不可见字符

元字符

定义原子的筛选方式,队员原子进行归类,简化正则表达式的书写。

  • | 匹配两个或者多个分支选择。 和计算机语言中的含义是一样的:或者
  • [] 匹配方括号中的任意一个原子。
  • [^] 配配除方括号之外的任意字符串。
  • . 匹配除\n之外的任何单个字符。要匹配包括\n在内的任何字符,请使用象[.\n]的模式。
  • \d十进制数字,等同于[0-9]
  • \D 匹配任意一个非十进制的数字,等同于[^0-9]
  • \s 匹配任意一个不可见原子。等同于[\f\n\r\t\v]
  • \S 匹配一个可见原子。等同于[^\f\n\r\t\v]
  • \w 匹配任意数字、字母或下划线。既[0-9a-zA-Z_]
  • \W 匹配任意非数字、字母或下划线。即[^0-9a-zA-Z_]

量词

表示某一个原子连续出现的数量。

  • {n}表示前面的原子恰好出现n次
  • {n,} 表示前面的原子最少出现n次
  • {n,m}表示前面的原子最少出现n此,最多出现m次
  • * 匹配0次、1次、或者多次。等同于{0,}
  • + 一次或者多次。等同于{1,}
  • ? 0次数或者1次。等同于{0,1}

边界控制

  • ^ 匹配字符串开始的位置。即"必须以……为开头"
  • $ 匹配字符串结束的位置。即"必须以……为结尾"

模式单元

将模式单元中的括号及其正则表达式当做是一个原子来看待。

  • () 匹配其中的整体为一个原子。

修正模式

给正则表达式的匹配过程添加一种匹配模式

  • UU是懒惰匹配,不加U是默认的贪婪匹配。
  • i忽略英文字母大小写。
  • x忽略空白。(包括空格和按tab键输出的制表符)
  • s让元字符.匹配包括换行符在内的所有字符。
  • e preg_replace()在替换字符串中对逆向引用作正常的替换。简单的说,就是PHP会把replace的结果当做PHP代码。(替换字符串要符合php的语法规范) 例如:echo preg_replace('/(\d+),(\d+)/e', '$1+$2', '2,3');会输出5

书写方式为:

1$pattern = '/hello World/U'
2
3$pattern = '/hello World/i'
4
5$pattern = '/hello World/Ui'//可以任意组合

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

本文分享自微信公众号 - Golang语言社区(Golangweb)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一些Golang小技巧

    今天给大家介绍3个我觉得比较有启发的Golang小技巧,分别是以下几个代码片段 nsq里的select写文件和socket io模块里的sendfile fas...

    李海彬
  • 厚土Go学习笔记 | 29. 接口

    在go语言中,接口类型是由一组方法定义的集合。 一个类型是否实现了一个接口,就看这个类型是否实现了接口中定义的所有方法。在go语言中,无需特别的指明定义一个接口...

    李海彬
  • 厚土Go学习笔记 | 29. 接口

    在go语言中,接口类型是由一组方法定义的集合。 一个类型是否实现了一个接口,就看这个类型是否实现了接口中定义的所有方法。在go语言中,无需特别的指明? 定义一个...

    李海彬
  • Python爬虫之正则表达式入门正则表达式语法正则表达式实例ReMatch对象贪婪匹配和最小匹配

    Re库是Python的标准库,主要用于字符串匹配 调用方式: import re

    desperate633
  • 正则表达式「^」符号的正确理解方式

    「^」这个符号在正则表达式的中的应用相信是所有程序员都掌握的, 因为它是正则表达式中最基础最常用的知识点。 它在正则表达式中表示两种不同的意义 01 表示匹配一...

    用户1608022
  • 正则&highlight高亮实现(干货)

    写完正则表达式以后在浏览器上检测实在是不方便,于是就写了一个JS正则小工具,大大地提高了学习效率。学习之余用正则实现了一个highlight高亮demo,欢迎交...

    牧云云
  • Go语言实战笔记(二十六)| Go unsafe 包之内存布局

    unsafe,顾名思义,是不安全的,Go定义这个包名也是这个意思,让我们尽可能的不要使用它,如果你使用它,看到了这个名字,也会想到尽可能的不要使用它,或者更小心...

    飞雪无情
  • 【正则表达式学习笔记之一】简单认识正则表达式

    一、引言   正则表达式是什么东东?   在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句...

    Angel_Kitty
  • Python正则表达式初识(一)

    首先跟大家简单唠叨两句为什么要学习正则表达式,为什么在网络爬虫的时候离不开正则表达式。正则表达式在处理字符串的时候扮演着非常重要的角色,在网络爬虫的时候也十分常...

    Python进阶者
  • Python正则表达式初识(一)

    首先跟大家简单唠叨两句为什么要学习正则表达式,为什么在网络爬虫的时候离不开正则表达式。正则表达式在处理字符串的时候扮演着非常重要的角色,在网络爬虫的时候...

    Python进阶者

扫码关注云+社区

领取腾讯云代金券