正则基础语法
正则表达式
正则表达式是模糊匹配的
像str.indexOf('abc')是精确匹配
//匹配一个字符串是否有数字
const reg = /\d/gi
//匹配一个字符串是否有非数字
const str = /\D/gi
正则对象
要使用正则表达式,就必须在程序创建正则对象
其中,有两种创建方式
正则对象
- 1. 隐式创建
const 对象 = /匹配模式/匹配标志
const reg = /\d/gi
// 动态正则匹配
const regSubstring = '0123456789'.substring(4,7)
const reg1 = eval(`/${regSubstring}/g`)
- 2. 直接实例化
/**
* @param {string | RegExp} 匹配模式
* @param {string} 匹配标志
*/
const reg = new RegExp('abcd','gi')
// 动态正则匹配
let name = "xxx";
const reg = new RegExp(name)
- 3. 区别
const reg = /\d/gi
// 如果直接实例化,那么像"\d"这样的字符,需要转义"\\d"
const reg = new RegExp("\\d","gi")
匹配标志
g
: 全局匹配i
: 忽略大小写
如果使用正则对象
在js中,使用正则对象主要有两种用法:
RegExp类
reg.test(str)
-
exec
: 返回匹配模式的字符串
reg.exec(str)
String类
-
search
: 匹配符合匹配模式的字符串出现的位置
str.search(reg)
-
match
: 以数组的方式返回匹配模式的字符串
str.match(reg)
-
replace
: 使用指定的内容替换匹配模式的字符串
// str.replace(regexp/substr,replacement)
// replacement: 必需。一个字符串值。规定了替换文本或生成替换文本的函数。
// $1、$2、...、$99: 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本
// $&: 与 regexp 相匹配的子串
// $`: 位于匹配子串左侧的文本
// $': 位于匹配子串右侧的文本
// $$: 直接量符号
let str = 'aaa-bbb-ccc'
str.replace('aaa', 'ddd') // "ddd-bbb-ccc"
str.replace(/ddd/, 'aaa') // "aaa-bbb-ccc"
str.replace(/(aaa)-/, '$1~') // "aaa~bbb-ccc"
str.replace(/\a/g, (item, index, str) => {
console.log(item, index, str) // a 0 aaa-bbb-ccc
return index // 最后返回结果:"012-bbb-ccc"
})
-
split()
:使用匹配模式的字符串作为分隔符对字符串进行分割,返回数组
str.split(reg)
子表达式
()
var str = 12312312php2545fxx
例如:/(\d)php/ //'(\d)'就是一个子表达式
捕获
在正则匹配模式中,子表达式匹配到的内容会被系统捕获至系统的缓冲区中,我们称之为捕获
var str = 12312312php2545fxx
例如:/(\d)php/ //2php 2就被捕获至系统 **1号** 的缓冲区中
反向引用
捕获之后,可以在匹配模式中使用\n(n:数字)来引用系统的第n号缓冲区内容
var str = 12312312php2545fxx
例如:/(\d)php\1/ //匹配的就是2php2了,\1是引用了1号缓冲区中的2,因为php前面的是2
- 例子
// + 匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}
// * 匹配前面的子表达式任意次。例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”。*等价于{0,}。
// \w 匹配包括下划线的任何单词字符。类似但不等价于“[A-Za-z0-9_]”,这里的"单词"字符使用Unicode字符集
// \W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”
// . 匹配除“\n”和"\r"之外的任何单个字符。要匹配包括“\n”和"\r"在内的任何字符,请使用像“[\s\S]”的模式。
var str = 'qewqsjava111javadssphp222php9uiyu33owds'
var reg = /(\W+)\d\d\d\1/gi;
str.match(reg)
//结果java111java,php222php
var reg = /(\w+)\d\d\d\1/gi;
var result;
while (result=reg.exec(str)) {
alert(result)
}
// result[0]:java111java 这是匹配到的内容
// result[1]:java 这里是第一个子表达式的值
// result[0]:php222php
// result[1]:php
查找连续相同的四个数字,如:1208
var reg = /\d\d\d\d/gi //或者var reg = /\d{3}/gi
查找连续相同的四个数字,如:1111
var reg = /\d\1\1\1/gi
查找数字,如:1221,3443
var reg = /(\d)(\d)\2\1/gi //1111这样的也会匹配到
查找字符,如:AABB,TTMM
var reg = /(\w)\1(\w)\2/gi
查找连续相同的四个数字或四个字符
var reg = /(\w)\1\1\1/gi
再一个字符串,查找一对html标记以及中间的内容
var str = iqeos<div>标签</div>adasdda<p>100.00p</p>qewq
var reg = /<(\w+)>.*<\/\1>/gi
一般情况下,后面的内容要求与前面的一致,就会用的子表达式、捕获、反向引用
-
exec方法和match方法的比较:
exec
方法是RegExp
类下的方法
match
是String
下的方法
match
方法直接返回一个数组
exec
方法需要循环反复调用
如果有子表达式,exec
方法将子表达式的捕获结果放到数字对应的元素中
正则语法
正则表达式是由普通字符(例如字符 a-z ,0-9)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
普通字符:a-z,0-9 等等
特殊字符(元字符):\d \s \w . * 等等
-
(1)限定符
-
限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配
* 匹配前面的组件零次或者多次
+ 匹配前面的组件一次或者多次
? 匹配前面的组件零次或者一次
{n} 匹配确定的 n 次
{n,} 至少匹配 n 次
{n,m} 最少匹配 n 次且最低匹配 m 次
-
* , + , ? 也可以用下面的方式表示
-
*
{0,} -
+
{1,} -
?
{0,1}
-
-
-
(2)字符匹配符
-
字符匹配符用于匹配某个或某些字符
带有[]的叫字符簇,一个簇表示一个字符
[a-z]
:表示 a-z 任意一个字符
[A-Z]
:表示 A-Z 任意一个字符
[0-9]
:表示0-9任意一个字符
[0-9a-z]
:表示 0-9 a-z 任意一个字符
[0-9a-zA-Z]
:表示 0-9 a-z A-Z任意一个字符
[abcd]
:表示a或b或c或d 任意一个字符
[1234]
:表示1或2或3或4 任意一个字符
[^a-z]
:表示除了 a-z 以外的任意字符
[^0-9]
:表示除了0-9以外的任意字符
[^abcd]
:表示除了1或2或3或4 以外的任意字符
\d
:匹配一个数字字符 [0-9]
\D
:匹配一个非数字字符 [^0-9]
\w
:匹配包括下划线的任意单词字符[0-9a-zA-Z_]
\W
:匹配任何非单词字符 [^0-9a-zA-Z_]
\s
:匹配任何空白字符 (空格、制表符、换行符)
\S
:匹配任何非空白字符
.
:匹配除 “\n” 之外的任何单个字符([./ n] 全部)
-
-
(3)定位符
定位符可以将一个正则表达式固定在一行的开始或者结束。也可以创建只在单词内或只在单词的开始或者结尾处出现的正则表达式
^
:匹配字符串的开始位置
$
:匹配字符串的结束位置
\b
:匹配单词的开始位置或结束位置
\B
:匹配不是单词开头位置或结束位置
注意:在字符簇的^跟不表达式里^是不同意思的
- 例如
[^x]
:匹配除了x以外的任意字符
[^aeiou]
:匹配除了aeiou这几个字母以外的任意字符var reg = /^a/ //表示匹配第一个位置a var reg = /\Ba\B/ //表示匹配前后都不是单词边界的a
- 例子:验证年龄
var reg = /^/d/d $/g
- 例如
-
(4)转义符
\
:用于匹配某些特殊字符 -
(5)选择匹配符
|
:可以匹配多个规则- 例子:
var str = 'hello Java,hello JavaScript' var reg = /hello (JavaScript|Java)/g console.log(str.match(reg)) // ["hello Java", "hello JavaScript"]
-
(6)关于正则表达式的几种特殊用法
-
(?=)
正向预查
var str = 'xxx好人,xxx好好人' var reg = /xxx(?=好人)/gi console.log(str.match(reg)) // ["xxx"](xxx好人的xxx)
-
(?!)
反向预查
var str = 'xxx好人,xxx好好人' var reg = /xxx(?!好人)/gi console.log(str.match(reg)) // ["xxx"](xxx好好人的xxx)
-
(?:)
结果不被捕获
var str = 'hello Java,hello JavaScript' var reg = /hello (JavaScript|Java)/g var result; while (result = reg.exec(str)) { console.log(result) // 结果:["hello Java", "Java", index: 0, input: "hello Java,hello JavaScript", groups: undefined] (备注:Java被捕获到子表达式了) // ["hello JavaScript", "JavaScript", index: 11, input: "hello Java,hello JavaScript", groups: undefined] (备注:JavaScript被捕获到子表达式了) } var reg = /hello (?:JavaScript|Java)/g while (result = reg.exec(str)) { console.log(result) // 结果:["hello Java", index: 0, input: "hello Java,hello JavaScript", groups: undefined] (备注:Java没有被捕获) // ["hello JavaScript", index: 11, input: "hello Java,hello JavaScript", groups: undefined] (备注:JavaScript没有被捕获) }
-
- 例如:
\d{3,5}
//匹配最少3个最多5个的数子
var str = 'jau123123122wjqei78781h123ui131213aa'
var reg = /\d{3,5}/gi
console.log(str.match(reg))
// 结果:["12312", "3122", "78781", "123", "13121"]
上面这个例子中,既匹配三个,也可以匹配五个,那么,正则表达式中会自动匹配最多的那一种,这在正则中叫贪婪匹配原则
在表达式的后面使用" ? ",表示非贪婪匹配原则,但是不会去匹配4个数字或者5个数字了
- 例如
var str = '123456q1234e12345'
var reg = /\d{3,5}?/gi
console.log(str.match(reg))
//结果: ["123", "456", "123", "123"]
- 例子:替换重复的字
var str = '我..是是.是.一一个个..好好.好人.人人'
var reg = /\.+/g
str = str.replace(reg,'') // "我是是是一一个个好好好人人人"
reg = /(.)\1+/g
str = str.replace(reg,'$1') // "我是一个好人"
// $1是1号缓冲区内容替换重复的内容
- 例子:验证ip是否有效
// 规则
// 例子 1.1.1.1
// 0-255
// 第一个段不能是0
// 不能以0开头 如:011
var str = '192.168.0.32'
var reg = /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/g
if (reg.test(str)) {
console.log('合法')
} else{
console.log('不合法')
}
- 例子:验证邮箱是否有效
var str = '347904341@cctv.admin.pl'
var reg = /^[\w\.]+@(\w+\.)+[a-z]{2,5}$/gi
if (reg.test(str)) {
console.log('合法')
} else{
console.log('不合法')
}