看完你就会正则表达式了

出场

为了匹配规定模式的文本
为了守护世界的和平
我们是穿梭在银河的正则表达式
就是这样~喵~

好用的正则表达式可视化工具: https://regexper.com/

语法

//字面量
var regExp1 = /pattern/flags;

//或用构造函数
var regExp2 = new RegExp(pattern[,flags]);

pattern:正则表达式的匹配模式
flags:可选,正则表达式的标识,也可选多个。g全局匹配,i忽略大小写,m匹配多行

一颗超简单的栗子:

var regExp = /abc/;
"abcdefg".replace(regExp,"WOW"); // "WOWdefg"

常用特殊字符

1.字符集合

字符 举例 含义
[] [xyz] xyz中任意一个字符 等价于[x-z]
[^] [^xyz] 匹配任意不在xyz中的一个字符,等价于[^x-z] (注意与^x区分,后者表示匹配以x开头的字符)
[-] [1-3] 匹配123中的任意一个字符,等价于[123]。注意:连字符只有出现在方括号中才表示连续的字符序列。

2.预定义模式

预定义模式就是某些常用模式的简写。

字符 含义
. 除\r和\n之外的任意字符,等价于[^\r\n]
\d 数字0-9,等价于[0-9]
\D 非数字字符,等价于[^0-9]
\w 字母数字下划线,等价于[A-Za-z0-9_]
\W 非字母数字下划线,等价于[^A-Za-z0-9_]
\s 空白符
\S 非空白符
\n 换行符

3.需要转义的字符

正则模式中,需要用斜杠转义的:

* + ? $ ^ . | \ ( ) { } [ ]

需要特别注意的是,如果使用RegExp方法生成正则对象,转义需要使用两个斜杠,因为字符串内部会先转义一次。

4.边界

字符 举例 含义
^ ^a 以a开头(注意与[^]区分,后者表示匹配不在[^]中的元素)
$ a$ 以a结尾
\b \bsmart,smart\b 单词边界,即[A-Za-z0-9_]之外的字符
\B \Bsmart 非单词边界

举个栗子说 \b 和 \B :

"You are smart,but she is smarter.".replace(/smart\b/,"kind");
//"You are kind,but she is smarter."

"You are smart,but she is smarter.".replace(/smart\B/,"kind");
//"You are smart,but she is kinder."

if(不懂){ 就置几动手试试吧 (ง •̀_•́)ง }

5.数量

字符 含义
? 匹配前面的模式 0或1次 {0,1}
* 匹配前面的模式 0或多次 {0,}
+ 匹配前面的模式 1或多次 {1,}
{n} 匹配前面的模式 n次
{n,} 匹配前面的模式 至少n次
{n,m} 匹配前面的模式 至少n次,至多m次
{0,m} 匹配前面的模式 至多m次
x(?=y) 只有x后面紧跟着y时,才匹配x,但是y不是匹配结果的一部分。例如/smart(?=girl)/只有后面有girl时,才匹配smart,但是girl不是匹配结果的一部分。
x(?!y) 只有x后面不紧跟着y时,才匹配x。例如/\d+(?!\.)/只有一个数字后面没有紧跟着小数点时才会匹配该数字,/\d+(?!\.)/.exec("3.141")匹配结果是141

6.贪婪与懒惰(非贪婪)

认是贪婪模式匹配,即匹配尽可能多的字符。

var regExp1 = /\d{3,6}/;
"1234567890".replace(regExp1,"X");
//"X7890"

若想手动开启懒惰模式,需要在模式后加 ?

var regExp1 = /\d{3,6}?/;
"1234567890".replace(regExp1,"X");
//"X4567890"

7.分组与反向引用

分组又叫“子表达式”,把完整的正则表达式分成一个个小组,然后反过来用“组号”去引用这些小组就叫“反向引用”。

用例子来说:

//无分组
var regExp1 = /abc{2}/; //这样量词{2}只能匹配到c一个字符

//分组
var regExp2 = /(abc){2}/; //这样量词{2}就可以匹配到abc三个字符啦 
//同时 abc 也有了一个组号 $1

再看一个栗子:

var reg = /(\d{1}).*(\d{2}).*(\d{3})/;
"1sss23sss456".replace(reg,"$1?$2?$3");
//"1?23?456"

上面的栗子换一种使用分组的方式:

var reg = /(\d{1}).*(\d{2}).*(\d{3})/;
var result = reg.exec("1sss23sss456");
console.log(result[1]+"-"+result[2]+"-"+result[3]);
//"1-23-456"

组匹配非常有用,下面是一个匹配网页标签的例子:

var tagName = /<([^>]+)>[^<]*<\/\1>/; // \1 就是第一个组匹配的内容
tagName.exec("<b>bold</b>")[1]

上面代码稍加修改,就可以捕获带有属性标签

var html = '<b class="hello">Hello</b><i>world</i>';
var tag = /<(\w+)([^>]*)>(.*?)<\/\1>/g;

var match = tag.exec(html);

match[1] // "b"
match[2] // " class="hello""
match[3] // "Hello"

match = tag.exec(html);

match[1] // "i"
match[2] // ""
match[3] // "world"

非捕获组: (?:x) 表示不返回该组匹配的内容,即匹配的结果中不出现这个括号。

常用方法

正则对象的方法

1.RegExp.prototype.test()

测试当前正则是否能匹配目标字符串,返回布尔值。

var reg = /\d{2}/;
var str = "1sss23sss456";
reg.test(str); //true

2.RegExp.prototype.exec()

在目标字符串中执行一次正则匹配操作,返回匹配的子字符串。

var reg = /\d{2}/;
var str = "1sss23sss456";
var result = reg.exec(str); 
result[0]; //23
result.index; //4
result.input; //"1sss23sss456"

3.RegExp.prototype.toString()

返回一个字符串,其值为该正则对象的字面量形式。覆盖了Object.prototype.toString() 方法

var reg = /\d{2}/;
reg.toString(); // "/\d{2}/"

字符串对象的方法

1. str.replace()

返回替换后的值

var reg = /\d{2}/;
var str = "1sss23sss456";
str.replace(reg,"?"); //"1sss?sss456"

常用于消除首尾空格:

var str = '  abc def ggg   ';
str.replace(/^\s+|\s+$/g,'');
// 'abc def ggg'

replace方法的第二个参数可以使用美元符号来指代所替换的内容

> $& 指代匹配的子字符串。
> $` 指代匹配结果前面的文本。
> $' 指代匹配结果后面的文本。
> $n 指代匹配成功的第n组内容,n是从1开始的自然数。
> $$ 指代美元符号$。

replace方法的第二个参数还可以是一个函数,将每一个匹配内容替换为函数的返回值。这个函数可以接受多个参数,第一个参数是捕捉到的内容,第二个参数开始是捕捉到的组匹配(有多少个组匹配,就对应有多少个参数)。此外,最后还可以添加两个参数,倒数第二个是捕捉到的内容在整个字符串中的位置,最后一个参数是原字符串。下面是一个网页模板替换的例子:

var prices = {
  'pr_1': '$1.99','pr_2': '$7.99','pr_3': '$9.99',};

var template = '<span id="pr_1"></span><span id="pr_2"></span>';

template.replace(
  /(<span id=")(.*?)(">)(<\/span>)/,function(match,p1,p2,p3,p4) {
    return p1 + p2 + p3 + prices[p2] + p4;
  });
//<span id="pr_1">$1.99</span><span id="pr_2"></span>

注意:第二个分组要加 ? 开启懒惰模式,否则正则表达式认的贪婪模式会匹配尽可能多的字符。贪婪模式下,上面的例子中第二个分组会匹配到pr_1"></span><span id="pr_2 这一长串,从而无法匹配到我们希望的字符串。

2.match()

exec()类似,返回匹配的子字符串。

var reg = /\d{2}/;
var str = "1sss23sss456";
str.match(reg); //["23"]

exec()的区别在于:当正则表达式加了g标识符时,结果不同。看栗子:

var reg = /\d{2}/g;
var str = "1sss23sss456";
reg.exec(str); //["23"]
str.match(reg); //["23","45"]

3.search()

返回匹配的首字符的位置。

var reg = /\d{2}/;
var str = "1sss23sss456";
str.search(reg); //4

4.split()

返回分割后的数组。

var reg = /\d{2}/;
var str = "1sss23sss456";
str.split(reg); //["1sss","sss","6"]

小练习

  1. 一个匹配手机号的正则(第一位是1,第二位是[3,4,5,7,8]中的一个,后面还有9位数字)

  2. 一个匹配 2017-01-01 或 2017/01/01 这两种格式日期的正则表达式

————答案:

  1. /^1[34578]\d{9}$/

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

应用

1.使用正则改变数据结构

var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re,"$2,$1");
console.log(newstr); //Smith,John

2.在多行中使用正则表达式

var s = "Please yes\nmake my day!";
s.match(/yes.*day/); // null
s.match(/yes[^]*day/); //'yes\nmake my day'

3.从URL中提取子域名

var url = "http://xxx.domain.com";
console.log(/[^.]+/.exec(url)[0]); //  "http://xxx"
console.log(/[^.]+/.exec(url)[0].substr(7)); //  "xxx"

匹配除了.之外的任意元素,一到多个字符。

“不会应用等于没有学会”,热烈欢迎小伙伴们在评论区补充平时用到正则表达式的地方,然后我会添加文章里,一起收集吧 ヽ(•̀ω•́ )ゝ

参考:

1.正则表达式学习笔记

2.MDN RegExp文档

3.实战JS正则表达式

4.正则表达式30分钟入门教程

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


正则替换html代码中img标签的src值在开发富文本信息在移动端展示的项目中,难免会遇到后台返回的标签文本信息中img标签src属性按照相对或者绝对路径返回的形式,类似:<img src="qinhancity/v1.0.0/ima
正则表达式
AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描,过滤,统计汇总等工作,数据可以来自标准输入也可以是管道或文件。当读到第一行时,匹配条件,然后执行指定动作,在接着读取第二行数据处理,不会默认输出。如果没有定义匹配条件,则是默认匹配所有数据行,awk隐含循环,条件匹配多少次,动作就会执行多少次。逐行读取文本,默认以空格或tab键为分割符进行分割,将分割所得的各个字段,保存到内建变量中,并按模式或或条件执行编辑命令。与sed工作原理相比:s
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及他们的组合组成了一个规则,然后检查一个字符串是否与这种规则匹配来实现对字符的过滤或匹配。我们刚才在学习正则表达式的时候,我们表示数字,字母下划线的时候是用w表示的,为什么我们在书写的时候用的是w?我们可以发现我们分割空格的话,并没有达到我们预期的效果,这里我们可以使用正则表达式的方式进行分割。我们可以发现,我们和上面得到的结果不一致,既然出错了,肯定是我们的使用方式不对。看到这里我们就能感受到正则表达式的作用了,正则表达式是字符串处理的有力工具。
Python界一名小学生,热心分享编程学习。
收集整理每周优质开发者内容,包括、、等方面。每周五定期发布,同步更新到和。欢迎大家投稿,,推荐或者自荐开源项目/资源/工具/文章~
本文涉及Shell函数,Shell中的echo、printf、test命令等。
常用正则表达,包括: 密码、 手机号、 身份证、 邮箱、 中文、 车牌号、 微信号、 日期 YYYY-MM-DD hh:mm:ss、 日期 YYY-MM-DD、 十六进制颜色、 邮政编号、 用户名、 QQ号
一、python【re】的用法1、re.match函数·单一匹配-推荐指数【★★】2、re.search函数·单一匹配-推荐指数【★★★★★】3、re.findall函数·多项匹配-推荐指数【★★★★★】4、re.finditer函数·多项匹配-推荐指数【★★★★】5、re.sub函数·替换函数-推荐指数【★★★★】二、正则表达式示例·总有一款适合你1、正则表达式匹配HTML指定id/class的标签2、正则表达式匹配HTML中所有a标签中的各类属性值3、获取标签的文本值
1.借助词法分析工具Flex或Lex完成(参考网络资源)2.输入:高级语言源代码(如helloworld.c)3.输出:以二元组表示的单词符号序列。通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。由于各种不同的高级程序语言中单词总体结构大致相同,基本上都可用一组正则表达式描述,所以构造这样的自动生成系统:只要给出某高级语言各类单词词法结构的一组正则表达式以及识别各类单词时词法分析程序应采取的语义动作,该系统
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。例如:我们在写登录注册功能的时候使用的表单验证(对用户名、密码进行一些字符或长度进行限制) ===> (`匹配`) - 正则表达式还常用于过滤掉页面内容的一些敏感词汇。例如:我们平常在打游戏时候的口吐芬芳被换成了***:full_moon_with_face: ===> (`替换`) - 正则表达式从字符串中获取我们想要的特定部分。例如:我们在逛淘宝的时候在搜索框中搜索内容,会弹出很多与搜索相关的提示内容 ===> (`提取`) etc..
通过上面几个简单的示例,可以了解到常见的基础正则表达式的元字符主要包括以下几个^ 匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配”^”字符本身,请使用"^"$ 匹配输入字符串的结尾位置。如果设置了RegExp对象的 Multiline属性,则"$”也匹配'n'或'r’,。要匹配”$"字符本身,请使用”$". 匹配除"rn"之外的任何单个字符 反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义* 匹配前面的子表达式零次或多次。...
给出补充后描述 C 语言子集单词符号的正则文法,设计并实现其词法分析程序。
正则表达式(Regular Expression),又称规则表达式,它不是某个编程语言所特有的,是计算机科学的一个概念,通常被用来检索和替换符合某些规则的文本。
Python Re 正则表达式 数据匹配提取 基本使用
正则表达式:是用来描述字符串内容格式,使用它通常用于匹配一个字符串的内容是否符合格式要求
python的学习还是要多以练习为主,想要练习python的同学,推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程+刷题+面经+求职+讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!