目录
前言
正则表达式是一种文本模式,包括普通字符和元字符(一些特殊字符),主要就是使用单个字符串来描述,匹配一系列匹配某个句法规则的字符串。
我在学习正则表达式的时候感觉里面的东西又多又乱,但它功能强大,应用时能提高效率。
一、正则表达式符号
修饰符:
g global 全局
i ignore case 不区分大小写
m multiline 多行
三种括号:
小括号():表示一个子表达式,括号中的内容是一个完整的正则表达式;
中括号 [ ] :字符集,匹配单个字符,是否属于中括号中的一个字符;
大括号 { } :用于重复次数,大括号左边的表达式的匹配次数。
// 查找的字符串
let str = 'hellello'
// 正则表达式内容
// 匹配字符串 'ell'
let patt = /(ell)/
console.log(str.match(patt))
// 匹配字符 'e' 或 'l' 全局查找
let patt1 = /[el]/g
console.log(str.match(patt1))
// 将字符串 'ell' 匹配两次
let patt2 = /(ell){2}/
console.log(str.match(patt2))
边界:
^ 1,匹配输入开始。如果多行标志被设为true,也会匹配一个断行符的开始处;
2,放在字符集 [ ] 中开头,表示取反。
$ 匹配输入结尾。如果多行标志被设为 true,也会匹配一个断行符的前的结尾处。
字符类:
. (点号,小数点)匹配任意单个字符,但是行结束符除外
\d 匹配任意阿拉伯数字。等价于[0-9]
\D 匹配任意一个不是阿拉伯数字的字符。等价于[^0-9]
\w 匹配任意字母,数字,下划线。等价于 [A-Za-z0-9_]
\W 匹配除字母,数字,下划线之外的字符。等价于 [^A-Za-z0-9_]
\s 匹配一个空白符,包括空格、制表符、换页符、换行符和其他 Unicode 空格。
\S 匹配一个非空白符。
\t 匹配一个水平制表符(tab)
\r 匹配一个回车符(carriage return)
\n 匹配一个换行符(linefeed)
\v 匹配一个垂直制表符(vertical tab)
\f 匹配一个换页符(form-feed)
let str = `hello
123 world`
// 任意单个字符
// let patt = /./ //[ 'h', index: 0, input: 'hello \n123 world', groups: undefined ]
// 任意数字
// let patt = /\d/ //[ '1', index: 7, input: 'hello \n123 world', groups: undefined ]
// 匹配空白符
// let patt = /\s/ //[ ' ', index: 5, input: 'hello \n123 world', groups: undefined ]
// 匹配换行符
let patt = /\n/ //[ '\n', index: 6, input: 'hello \n123 world', groups: undefined ]
console.log(str.match(patt))
字符集合:
[xyz] 一个字符集合,也叫字符组,匹配集合中的任意一个字符,可以使用 ‘-’ 来指定一个范围。
[^xyz] 反义字符组,匹配任意不在括号内的字符。
上面的正则表达式的符号都是任意匹配一个字符。下面的数量词可以匹配多个字符。
数量词:
x* 匹配前面的模式 x 0 或多次。
x+ 匹配前面的模式 x 1 或多次。等价于 {1,}。
x? 匹配前面的模式 x 0 或 1 次。
x{n} n 是一个正整数。前面的模式 x 连续出现 n 次时匹配
x{n,} n 是一个正整数。前面的模式 x 连续出现至少 n 次时匹配。
x{n,m} n 和 m 为正整数。前面的模式 x 连续出现至少 n 次,至多 m 次时匹配。
x*? 像上面的 * 一样匹配前面的模式 x,然而匹配是最小可能匹配。
x+? 像上面的 + 一样匹配前面的模式 x,然而匹配是最小可能匹配。
x|y 匹配 x 或 y
let str = `hello
123 world`
let patt =/[l]{2,}/ //[ 'll', index: 2, input: 'hello \n123 world', groups: undefined ]
// let patt =/[l]{2}/
console.log(str.match(patt))
重复方法:
贪婪 匹配重复字符时是尽可能多的匹配,默认{1,4}
非贪婪 匹配重复字符时是尽可能少地匹配,在待匹配的字符数量词后跟随一个问号即可
例如: {1,4}?
/a+/ 可以匹配一个或者多个连续的字母a, 当使用“aaa”作为匹配字符串时正则表达式会匹配它的三个字符。
/a+?/ 可以匹配一个或者多个连续的字母a, 但是尽可能少地匹配。只能匹配第一个a
let str = 'aaaaaa'
// let patt = /a+/ //[ 'aaaaaa', index: 0, input: 'aaaaaa', groups: undefined ]
let patt = /a+?/ //[ 'a', index: 0, input: 'aaaaaa', groups: undefined ]
console.log(str.match(patt))
二、常用的正则表达式
Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?
中文字符的正则表达式:[\u4e00-\u9fa5]
经度:((^[-]?[0-9])|(^[-]?[2-9]([0-9])?)|(^[-]?[1](([0-7])?)(([0-9])?)))(([.](([0-9])|([1-5][0-9])))?){1,2}$
纬度:((^[-]?[0-9])|(^[-]?[1-8]([0-9])?))(([.](([0-9])|([0-5][0-9])))?){1,2}$
像一些账号和密码,不同的地方有不同的规则。