【转载】最全的正则表达式教程

一、正则基础概述

 

首先给出正则最基础的知识点概述,好让同学们能回想起一些之前学过的知识点,能更好地进行阅读 这里分享一个在线练习正则的网站,同学们可以在这里进行练习 -->在线练习 https://regex101.com/ 笔记中例子中如特殊没有指出,则默认使用 /g 标志(修饰符)全局搜索作为示范

1、什么是正则表达式?

正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。通俗的讲就是按照某种规则去匹配符合条件的字符串。 一个正则表达式是一种从左到右匹配主体字符串的模式。 “Regular expression”这个词比较拗口,我们常使用缩写的术语“regex”或“regexp”。 正则表达式可以从一个基础字符串中根据一定的匹配模式替换文本中的字符串、验证表单、提取字符串等等

2、基础语法图表

2.1 - 基础语法表格

首先先给出最最基础部分的匹配规则,这个是肯定要会的

single char (单字符)quantifiers(数量)position(位置)
\d 匹配数字 * 0个或者更多 ^一行的开头
\w 匹配word(数字、字母) + 1个或更多,至少1个 $一行的结尾
\W 匹配word(数字、字母) ? 0个或1个,一个Optional \b 单词"结界"(word bounds)
\s 匹配white space(包括空格、tab等) {min,max}出现次数在一个范围内  
\S 匹配white space(包括空格、tab等) {n}匹配出现n次的  
. 匹配任何,任何的字符    

 

2.2-修饰符(三个 g 、i、m)

修饰符与其他语法特殊,字面量方法声名的时候放到//后,构造函数声明的时候,作为第二个参数传入。整个正则表达式可以理解为正则表达式规则字符串+修饰符

  • g:global 执行一个全局匹配
  • i:ignore case执行一个不区分大小写的匹配
  • m: multiple lines多行匹配

修饰符可以一起用

/\bis\b/gim

修饰符:g

没有g只替换了第一个,有g 所有的都换了

无修饰符g

 

有修饰符g

 

 

修饰符:i

有i忽略大小写,没有i严格区分大小写

 

修饰符:m

2.3-常用语法示例图解析

此处暂时看不懂没关系,后面会进行详细的语法介绍,此处只是让我们对正则表达式更有概念,感觉不好理解可以跳过,学完再回来看

此示例图解析部分主要摘录自 comer的60分钟正则从入门到深入(https://segmentfault.com/a/1190000013075245?sort=votes)。

本人觉得其图画的挺好的,且确实刚开始可以稍微看下正则具体应用,方便后续理解,便摘录下来。

 

a) 通用正则表达式

 

b) 手机号正则

/^1[34578][0-9]{9}$/

 

 

 tips:以1开头,第二位为3 4 5 7 9 其中一个,以9位(本身1次加重复8次)0-9数字结尾

c) 单词边界

/\bis\b/

tips: is前后都是单词的边界,比较晦涩难懂?感受下两者的区别,b 会放到语法部分讲解

d) URL分组

/http:(\/\/.+\.jpg)/

正则表达式中括号用来分组

 

e) 日期匹配

/^\d{4}[/-]d{1,2}[/-]\d{1,2}$/

这个正则比较复杂,画符念咒的地方太多了,一一分析:

  • Start of line 是由^生效的表示以此开头
  • 对应结尾End of line 由$生效表示以此结尾
  • 接着看digit 由 d 生效表示数字
  • 3times 由{4} 生效表示重复4次,开始的时候有疑问,为什么不是 4times 。后来明白作者的用意,正则表达式是一个规则,用这个规则去从字符串开始匹配到结束(注意计算机读字符串可是不会分行的,都是一个串,我们看到的多行,人家会认为是个 t )这里设计好像小火车的轨道一直开到末尾。digit 传过一次,3times表示再来三次循环,共4次,后面的once同理。 自己被自己啰嗦到了。
  • 接下来,是 one of 在手机正则里面已经出现了。表示什么都行。只要符合这两个都让通过。

f) 日期分组匹配

/^(\d{4})[/-](\d{1,2})[/-](\d{1,2})$/

3、基本匹配

正则表达式其实就是在执行搜索时的格式,它由一些字母(也可以是汉字)和数字组合而成。

例如:一个正则表达式 学习的汪 H,它表示一个规则:由'学'开始,接着是'习',…最后'H'。它是逐个字符与输入的正则表达式作比较,同时大小写敏感

 

二、元字符

正则表达式主要依赖于元字符。 元字符不代表他们本身的字面意思,他们都有特殊的含义。一些元字符写在方括号中的时候有一些特殊的意思。

2.1、元字符列举

 

元字符描述
. 句号匹配任意单个字符除了换行符。
[ ] 字符种类。匹配方括号内的任意字符。
[^ ] 否定的字符种类。匹配除了方括号里的任意字符
* 匹配>=0个重复的在*号之前的字符。
+ 匹配>=1个重复的+号前的字符。
? 标记?之前的字符为可选.
{n,m} 匹配num个大括号之前的字符或字符集 (n <= num <= m).
(xyz) 字符集,匹配与 xyz 完全相等的字符串.
| 或运算符,匹配符号前或后的字符.
\ 转义字符,用于匹配一些保留的字符 `[ ] ( ) { } . * + ? ^ $ \
^ 从开始行开始匹配.
$ 从末端开始匹配.

 

2.2、点运算符 --> .

.是元字符中最简单的例子。 .匹配任意单个字符,但不匹配换行符。 例如,表达式 [...o ] 匹配3个(几个点就几位)任意字符后面跟着是 [ o ] 的字符串

2.3、字符集

字符集也叫做字符类。 方括号用来指定一个字符集。 在方括号中使用连字符来指定字符集的范围。 在方括号中的字符集不关心顺序。

例如,表达式 [ 学习的汪 [Hh] ] 匹配 [ 学习的汪 h ] 和 [ 学习的汪 H ] 

 2.4、字符集中匹配句号. -->> [.]

前面我们说过点运算符,那同学们是否会有个疑惑, . 被用来匹配任意字符,那么作为字符串中的句号.,又该用什么匹配呢?

方括号的句号就表示句号。 表达式 lin[.] 匹配 lin.字符串

点代表任意字符

 

点代表句号

 

2.5、否定字符集 -->> [^]

 一般来说 ^ 表示一个字符串的开头,但它用在一个方括号的开头的时候,它表示这个字符集是否定的。 例如,表达式[^地]学习的[^帅] 匹配一个字符串为 [ 学习的 ]的, 同时前面一位字符串不能为,后面一位字符串不能为

 

 

2.6、点(.)的特殊用法

正则表达式中,点(.)是一个特殊字符,代表任意的单个字符,但是有两个例外。一个是四个字节的 UTF-16 字符,这个可以用u修饰符解决;另一个是"行终止符"(line terminator character)。

所谓"行终止符",就是该字符表示一行的终结。以下四个字符属于“行终止符”。

U+000A 换行符(\n)
U+000D 回车符(\r)
U+2028 行分隔符(line separator)
U+2029 段分隔符(paragraph separator)

示例 1:

/foo.bar/.test('foo\nbar') // false

上面代码中,因为.不匹配\n,所以正则表达式返回false

 

但是,很多时候我们希望匹配的是任意单个字符,这时有一种变通的写法。

/foo[^]bar/.test('foo\nbar') // true

当然,这种解决方案毕竟不太符合直觉, ES2018 引入s修饰符,使得.可以匹配任意单个字符。

/foo.bar/s.test('foo\nbar') // true

 

 

2.7、重复次数 -->> *、+、?

后面跟着元字符 +* or ? 的,用来指定匹配子模式的次数。 这些元字符在不同的情况下有着不同的意思。

a) * 号

*号匹配 在*之前的字符出现大于等于0次。 例如,表达式 a* 匹配0或更多个以a开头的字符。表达式[a-z]* 匹配一个行中所有以小写字母开头的字符串。

 

*号搭配 .号。

*字符和.字符搭配可以匹配所有的字符.*。 *和表示匹配空格的符号\s连起来用,如表达式\s*学习\s*匹配0或更多个空格开头和0或更多个空格结尾的cat字符串。

//[学习]前一个空格,后面无空格
努力 学习的汪 hongjilins              
//[学习]前后多个空格
努力   学习   的汪hongjilins    
努力学习的帅汪 Hongjilin.

b) +

+号匹配+号之前的字符出现 >=1 次。 例如表达式学习.+汪 匹配以中文学习开头以 [汪] 结尾,中间跟着至少一个字符的字符串

"学习.+汪" => 
努力学习的汪 hongjilins   
努力学习的帅汪 Hongjilin. 
努力学习 66 汪 Hongjilin. 
努力的学习汪               //此行无匹配结果

c) ? 号

在正则表达式中元字符 ? 标记在符号前面的字符为可选,即出现 0 或 1 次。 例如,表达式 学习的[帅]?汪 匹配字符串 学习的汪 和 学习的帅汪

"学习的[帅]?汪" => 
努力学习的汪 hongjilins
努力学习的帅汪 Hongjilin. 
努力的学习汪                 //无匹配结果
努力学习的帅气汪 Hongjilin. //无匹配结果

 

 

posted @ 2022-12-06 10:50  阿瞒123  阅读(166)  评论(0编辑  收藏  举报