浅谈正则表达式
正则表达式是对字符串进行查找替换和提取等操作的工具。有两种写法:
直接量语法
/pattern/attribues
RegExp对象语法
new RegExp(pattern,attributes);
举个例子,比如我们要在一段字符串中查找所以数字,如下:
var str = "1 23 sda 34 adl34 7655 87 a 90 0";
console.log(str.match(/\d+/g))
// ["1", "23", "34", "34", "7655", "87", "90", "0"]
只需要这么简单的一段代码就能在控制台打印出我们需要的结果了。如果用一般的写法,我们可能需要遍历字符串,还要对字符串的内容进行判断,就要写一大段代码,而利用正则表达式,我们可以很轻松的达成我们的需要。
再举个例子,我们要对"35621237.61"这串数字添加千分位分隔符:
var a = "35621237.61";
var reg=/(?=(\d{3})+(\.|$))/g;
console.log(a.replace(reg,","))
//35,621,237.61
就这样就搞定了!
不过正则表达式有个缺点,就是符号太多,有时候看上去一脸懵逼,为了了解正则表达式,我们现在来看看正则表达式的各种属性,以利用这个强大的工具。
参数
参数 pattern 是一个字符串,制订了正则表达式的模式和其他正则表达式
参数 attributes 是一个可选的字符串,包含属性"g"、"i"、"m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。
修饰符
i 执行对大小写不敏感的匹配
g 全局匹配,即查找所有匹配
m 执行多行匹配
方括号
方括号用于查找某个范围内的字符
[abc] 查找方括号之间的任何字符
[^abc] 查找任何不在方括号之间的字符
[0-9] 查找任何从 0 至 9 的数字
[a-z] 查找任何从小写 a 到小写 z 的字符
[A-Z] 查找任何从大写 A 到大写 Z 的字符
[adgk] 查找给定集合内的任何字符
元字符
即特殊符号
. 查找单个字符,除了换行和行结束符
\w 查找单词字符
\W 查找非单词字符
\d 查找数字
\D 查找非数字字符
\s 查找空白字符
\S 查找非空白字符
\b 匹配单词边
\B 匹配非单词边界
\0 查找 NUL 字符
\n 查找换行符
\f 查找换页符
\r 查找回车符
\t 查找制表符
\v 查找垂直制表符
\xxx 查找以八进制数 xxx 规定的字符
\xdd 查找以十六进制数 dd 规定的字符
\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符
量词
n+ 匹配任何包含至少一个 n 的字符串
n* 匹配任何包含零个或多个 n 的字符串
n? 匹配任何包含零个或一个 n 的字符串
n{X} 匹配包含 X 个 n 的序列的字符串
n{X,Y} 匹配包含 X 至 Y 个 n 的序列的字符串
n{X,} 匹配包含至少 X 个 n 的序列的字符串
n$ 匹配任何结尾为 n 的字符串
^n 匹配任何开头为 n 的字符串
?=n 匹配任何其后紧接指定字符串 n 的字符串
?!n 匹配任何其后没有紧接指定字符串 n 的字符串
贪婪匹配
顾名思义,即正则表达式一般趋向于最大长度匹配。但有时候我们不需要令他匹配太多,这就需要执行“非贪婪匹配”。
非贪婪匹配,就是匹配到结果就好.
var a="123 34 4445 99486 90";
var reg=/\d{3,}/g;
console.log(a.match(reg))
//["123", "4445", "99486"]
在上面的例子中,我们要查找3个及3个以上的数字,我们匹配到的结果就是["123", "4445", "99486"]。那如何启用非贪婪匹配呢,只需要在量词后面加个“?”就好了。
var a="123 34 4445 99486 90";
var reg=/\d{3,}?/g;
console.log(a.match(reg))
//["123", "444", "994"]
? 也是一个量词,在上面的属性表中我们知道了,他的意思就是匹配另个或一个字符串。
分支、分组、引用
分支
var a = "Hello my name is pureview";
var reg=/name|pureview/;
sondole.log(a.match(reg));
// ["name", "pureview"]
如上,我们想匹配name,又想匹配pureview两个单词,可以使用特殊符号"|",这样就即可以找到name,也可以找到pureview了
分组与调用
var a=`
abc
2017-08-22
test/07/ss
2018/09/121
2019/11/02
11232/33/44225
11234-123-45`;
var reg=/\d{4}[-/]\d{2}(-|\/)\d{2}[^0-9]/g;
console.log(a.match(reg));
//["2017-08-22", "2018/09/12"]
如上,我们要从上面的字符串中找到正确的日期。先来解释一下这串正则表达式:
\d{4} 匹配4位数字
[-/] 匹配-或者/连接符
\d{2} 匹配2位数字
(-|\/) 匹配-或者/连接符。因为/是特殊符号,所以需要\进行修饰
[^0-9] 以非数字结尾
正确的日期已经匹配到,现在我们把年-月-日格式的日期替换成月-日-年格式的,我们只需要对正则表达式进行分组,然后再调用就好了,代码如下:
var reg=/(\d{4})[-/](\d{2})(-|\/)(\d{2})[^0-9]/g;
var b=a.match(reg);
var c = b.join(",");
console.log(c.replace(reg,"$2-$4-$1"));
//08-22-2017,11-02-2019
对正则表达式进行分组只需要把相应的代码用括号括起来就好了。对分组的调用也很简单,用$加对应的组别调用就好,在上面的正则表达式中,(-|\/)其实也被认为是一个组,所以在调用日期的是,就是$4了。那么有没有办法忽略无谓的分组呢。其实可以的。
var reg=/(\d{4})[-/](\d{2})(?:-|\/)(\d{2})[^0-9]/g;
var b=a.match(reg);
var c = b.join(",");
console.log(c.replace(reg,"$2-$3-$1"));
//08-22-2017,11-02-2019
如上,只需在要忽略的分组里加一个?:就OK了
正则表达式对象属性
global 正则表达式对象是否具有标志 g
ignoreCase 正则表达式对象是否具有标志 i
lastIndex 一个整数,标示开始下一次匹配的字符位置
multiline 正则表达式对象是否具有标志 m
source 正则表达式的源文本
正则表达式对象方法
compile 编译正则表达式
test 检索字符串中指定的值。返回 true 或 false
exec 检索字符串中指定的值。返回找到的值,并确定其位置
支持正则表达式的字符串对象方法
search 检索与正则表达式相匹配的值
match 找到一个或多个正则表达式的匹配
replace 替换与正则表达式匹配的子串
split 把字符串分割为字符串数组
注意,如果字符串内有特殊字符,如""、".",在查找这些符号的时候,要在符号前加""转码
小知识:在字符串内,要想打印”“,那代码里要写两个反斜杠”\“
正则表达式的书写练习
当使用正则表达式的时候,一般会对字符串进行拆解,翻译然后进行拼接
手机号
比如,要验证表单里的手机号格式是否正确:
17631638693
首先,手机号均以"1"开头,手机号的前三位是手机号的各种特殊字段,比如150,134,176,189等。手机号的第二位是特殊的,后面的数字就是普通的数字了。正则表达式就可以这样写:
var num="17631638693";
var reg=/1[34578]\d{9}/;
//"1"是固定的,[34578]代表特殊字段,剩下的为普通数字
console.log(reg.test(num));
//true
QQ号
再比如QQ号,QQ号都是以"1"开头的数字,最少有5位
var qq="87629900";
var reg=/[1-9][0-9]{4,}/;
//[1-9]表示第一位为从1开始的任意数字,剩下的表示至少4位以上的任意数字;
console.log(reg.test(qq));
//true
邮箱
邮箱的正则表达式
var email="exp@exp.com";
var reg=/\w+@[a-zA-Z0-9]+\.[a-z]+/
//邮箱的名字可能是字母,或者数字,也可能出现下划线等,且至少有1个字符,所以用特殊字符"\w+"就可以匹配。邮箱服务商的名字可能是字母,数字,但是不会有下划线,邮箱服务商的名字长度至少一个字符,所以用[a-zA-Z0-9]+表示。域名就是普通的字母了,且至少一位。注意在".com"中的那个点,是个特殊字符,需要用反斜杠修饰
console.log(reg.test(email))
//ture
网址
网址的表达式可能会复杂些
比如http://www.baidu.com。我们来分析一下,前缀"http"是固定的,根据协议不同,还会有"https",后面的都是非空字符了,但是网址有结构,包含万维网,即"www" , 网站名,和域名,都要分别进行匹配
var url="https://www.baidu.com/"
var reg=/^http[s]?\:\/\/[a-z]+\.\w+\.[a-z]+[^\s]*$/
// "?"是特殊字符,表示0或1,即可有可无
console.log(reg.test(url))
//true
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。