正则基础语法

2019-02-25  本文已影响0人  ByePast

正则表达式

正则表达式是模糊匹配的
像str.indexOf('abc')是精确匹配

//匹配一个字符串是否有数字
const reg = /\d/gi
//匹配一个字符串是否有非数字
const str = /\D/gi

正则对象

要使用正则表达式,就必须在程序创建正则对象


其中,有两种创建方式
正则对象
const 对象 = /匹配模式/匹配标志
const reg = /\d/gi

// 动态正则匹配
const regSubstring = '0123456789'.substring(4,7)
const reg1 = eval(`/${regSubstring}/g`)
/**
 * @param {string | RegExp} 匹配模式
 * @param {string} 匹配标志
 */
const reg = new RegExp('abcd','gi')

// 动态正则匹配
let name = "xxx";
const reg = new RegExp(name)
const reg = /\d/gi

// 如果直接实例化,那么像"\d"这样的字符,需要转义"\\d"
const reg = new RegExp("\\d","gi")
匹配标志
如果使用正则对象

在js中,使用正则对象主要有两种用法:

RegExp类
reg.test(str)
reg.exec(str)
String类
str.search(reg)
str.match(reg)
// 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"
})
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

一般情况下,后面的内容要求与前面的一致,就会用的子表达式、捕获、反向引用

正则语法

正则表达式是由普通字符(例如字符 a-z ,0-9)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

普通字符:a-z,0-9 等等
特殊字符(元字符):\d \s \w . * 等等

贪婪匹配原则

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号缓冲区内容替换重复的内容
// 规则
// 例子 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('不合法')
}
上一篇下一篇

猜你喜欢

热点阅读