JavaScript 正则表达式

雨燕双飞 提交于 2020-01-18 20:23:52

前言

正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式,可用于文本搜索和文本替换。

工作中经常会使用正则表达式。虽然用的还算多,自己也懂一些正则表达式的知识,但是真到了要用的时候,还是要借助搜索引擎来解决问题。其实对于解决问题来说,达到 “通过搜索引擎解决问题” 这个程度,在日常工作中已经够用了。 但是,对于知识和技能,如果没有积累没有整理,只是凭借着工作中使用一下的记忆与印象来作为自己的经验的话,是远远不够的,不整理不总结,它永远不会是自己的东西。

秉持着 “没有积累就是没有经验,没有整理就是没有掌握” 的原则,在这里整理一下js中正则表达式的用法。

开始

step.1 什么是正则表达式?

正则表达式是由一个字符序列形成的搜索模式。
当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
正则表达式可以是一个简单的字符,或一个更复杂的模式。
正则表达式可用于所有文本搜索和文本替换的操作。

step.2 js 正则表达式的语法

/正则表达式主体/修饰符(可选)

例如:

var patt = /hello/i

在上面例子中,/hello/i 是一个正则表达式,其中,hello 是主体,用于检索;i是一个修饰符,表示不区分大小写。

step.3 正则表达式修饰符

i 表示不区分大小写,
g 表示全局匹配(否则会在查找到第一个匹配项后停止),
m 表示执行多行匹配。

step.4 正则表达式常用模式

[abc]     查找方括号之前的任何字符。
[^abc]   查找任何不在方括号之间的字符。
[a-z]	查找任何从小写 a 到小写 z 的字符。
[A-Z]	查找任何从大写 A 到大写 Z 的字符。
[A-z]	查找任何从大写 A 到小写 z 的字符。
[0-9], 查找任何从0到9的数字;
(x|y), 查找任何以 | 分隔的选项。

.	查找单个字符,除了换行和行结束符。
\w	查找单词字符。
\W	查找非单词字符。
\d	查找数字。
\D	查找非数字字符。
\s	查找空白字符。
\S	查找非空白字符。
\b	匹配单词边界。
\B	匹配非单词边界。
\0	查找 NULL 字符。
\n	查找换行符。
\f	查找换页符。
\r	查找回车符。
\t	查找制表符。
\v	查找垂直制表符。
\xxx	查找以八进制数 xxx 规定的字符。
\xdd	查找以十六进制数 dd 规定的字符。
\uxxxx	查找以十六进制数 xxxx 规定的 Unicode 字符。

n+	匹配任何包含至少一个 n 的字符串。

例如,/a+/ 匹配 "candy" 中的 "a","caaaaaaandy" 中所有的 "a"。

n*	匹配任何包含零个或多个 n 的字符串。

例如,/bo*/ 匹配 "A ghost booooed" 中的 "boooo","A bird warbled" 中的 "b",但是不匹配 "A goat grunted"。

n?	匹配任何包含零个或一个 n 的字符串。

例如,/e?le?/ 匹配 "angel" 中的 "el","angle" 中的 "le"。

n{X}	匹配包含 X 个 n 的序列的字符串。

例如,/a{2}/ 不匹配 "candy," 中的 "a",但是匹配 "caandy," 中的两个 "a",且匹配 "caaandy." 中的前两个 "a"。

n{X,}	X 是一个正整数。前面的模式 n 连续出现至少 X 次时匹配。

例如,/a{2,}/ 不匹配 "candy" 中的 "a",但是匹配 "caandy" 和 "caaaaaaandy." 中所有的 "a"。

n{X,Y}	X 和 Y 为正整数。前面的模式 n 连续出现至少 X 次,至多 Y 次时匹配。

例如,/a{1,3}/ 不匹配 "cndy",匹配 "candy," 中的 "a","caandy," 中的两个 "a",匹配 "caaaaaaandy" 中的前面三个 "a"。注意,当匹配 "caaaaaaandy" 时,即使原始字符串拥有更多的 "a",匹配项也是 "aaa"。

n$	匹配任何结尾为 n 的字符串。
^n	匹配任何开头为 n 的字符串。
?=n	匹配任何其后紧接指定字符串 n 的字符串。
?!n	匹配任何其后没有紧接指定字符串 n 的字符串。

step.5 test 方法

test() 方法是一个常用的正则表达式方法。

test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。

以下实例用于搜索字符串中的字符 ‘h’:

var patt = /h/;
patt.test("hello,world");

可以将上面代码在浏览器的Console中运行。
因为hello,world 中 包含了字符’h’ , 所以得到结果为 true;

上面的代码可以简写为

/h/.test('hello,world');

根据 [step.4] 中的模式,可以写出下面几个正则表达式的例子:

// 判断str是否是11位数字 ,可以用来简单的检测是否手机号
/^\d{11}$/.test(str); 

// 判断是否以王或李开头,并且以强结尾,且中间还有一个非空白字符
/^[王李]\S强$/.test('李大强')

// 判断是否是汉字
/^[\u4e00-\u9fa5]$/.test(char)

//判断name是不是 3字 吴什么凡
/^吴[\u4e00-\u9fa5]凡$/.test(name)

//判断str是否全是英文或数字
/^[A-Za-z0-9]+$/.test(str)

更多的例子读者可以参考文末的参考文档,或者自行搜索。

step.6 match 方法

match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。若没有加g修饰符,则只会匹配第一个;若有g修饰符,则会匹配所有符合条件的字符串,并将其作为一个数组返回。

例子:

var str='hello,world,i am a superman';
str.match(/.a/g);

输出结果为:

(3) [" a", " a", "ma"]

例子:

'<a>asd<c>adas<b>'.match(/<.>/g)

输出结果为:

(3) ["<a>", "<c>", "<b>"]

step.7 search 与 replace 与 split 方法

search() 方法 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。

replace() 方法 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

search 方法可使用字符串作为参数。字符串参数会转换为正则表达式。例子:

'hello,world'.search('w[o|p]r')

输出值为 6 ,表示被搜索的正则表达式的第一个出现为之为6; 若搜索不到则返回-1;

replace的例子如下:

'hello,world'.replace(/.o/g,'--')

输出结果为 “hel–,--rld” 。 如果不加g修饰符的话,则结果为 “hel–,world”

split方法用来 把一个字符串分割成字符串数组,它的参数可以使用正则表达式

'hello,world'.split(/.o/g)

输出为: (3) [“hel”, “,”, “rld”] , 可以看出是被 ‘lo’ 与 ‘wo’ 分割的。

结束

本文简单的总结了 js 中 正则表达式的 相关知识 与 用法。

参考文档

https://www.runoob.com/js/js-regexp.html

https://www.runoob.com/jsref/jsref-obj-regexp.html

https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php

https://www.cnblogs.com/dreamingbaobei/p/9717234.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!