正则表达式教程

1. 简介

正则表达式(英语:Regular Expression,常简写为regex、regexp或RE),又称正则表示式正则表示法规则表达式常规表示法,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。

2. 语法

2.1 普通字符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符

字符 描述                             示例                    
[ABCD] 所有大写"ABCD"
[^ABCD] 所有非大写"ABCD"其他字符
[0-9] 所有数字
[a-zA-Z] 所有字母
[\s] 所有空白字符
[\S] 所有非空白字符
[\w] 所有非空白字符,等价于[0-9a-zA-Z_]

匹配所有汉字可以使用[一-龥]

2.2 非打印字符

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

2.3 特殊字符

除去普通字符外,一些特殊字符的配合,可以让我们更方便的进行目标匹配。

  字符   描述                                       示例                  
$ 匹配输入字符串的结尾位置
( ) 标记一个子表达式的开始和结束位置,或者一个分组匹配 分组匹配见2.3.1
. 匹配除换行符 \n 之外的任何单字符
[ 标记一个中括号表达式的开始
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
\ 转义符
^ 匹配输入字符串的开始位置;在方括号中表示不接受表达式中的字符集合
{ 标记限定符表达式的开始
| 指明两项之间的一个选择
2.3.1 分组匹配

使用()可以对匹配结果分组,也就是分组1会返回整个表达式的匹配结果,分组2则会返回括号中的结果。
例如:

匹配结果

在Spark sql中,使用regexp_extract()则可以对每个分组进行提取

select regexp_extract('This is a regular expression', '(re)gular', 1)
/*
output:
re
*/

这个方法如果要取出某个字符之后/之前的数字,但并不相邻,则会很实用。
例如我们有三条字符串,分别为

Name:Nio, Height:180, Weight:75
Name:Trinity, Height==170, Weight==50
Name:Morphus, Height{175}, Weight{80}

我们想提取这三条字符串中的"Weight"后的数字

结果:

2.4 限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。

  字符  描述                            示例                                    
+ 匹配前面一个表达式1次或多次
* 匹配前面一个表达式0次或多次
? 匹配前面一个表达式0次或1次
{n} 匹配前面一个表达式n次
{n,m} 匹配前面一个表达式至少n次,至多m次。忽略m则为无上限

2.5 定位符

定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。

字符 描述                   示例         
^ 开始的位置
$ 结束的位置
\b 单词边界
\B 非单词边界

2.5.2 断言

正则中的断言有4中形式,断言与^代表开头,$代表结尾一样用于定位作用,分别是:

  1. (?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion)

使用re(?=gular)即可判断"gular"之前的"re"

如果在后面添加其他的表达式,则可继续匹配。也就是说,(?=gular)是用来修饰re的。

  1. (?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion)

使用re(?!gular)则可以判断非"gular"之前的"re"

  1. (?<=pattern) 零宽正向后行断言(zero-width positive lookbehind assertion)
  1. (? 零宽负向后行断言(zero-width negative lookbehind assertion)

3. 例子

1. 匹配字符串中的邮箱

正则表达式:\b[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,6}\b
测试字符串:my email is [email protected], please reply.

reference:
https://regex101.com/
https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F

你可能感兴趣的:(正则表达式教程)