正则表达式

1.元字符

定义字符的意义

元字符描述
. 匹配单个字符,除了换行和行结束符
w 匹配单词字符
W 匹配非单词字符
d 匹配数字
D 匹配非数字
s 匹配空白符
S 匹配非空白符
 匹配单词边界
B 匹配非单词边界
匹配 NUL字符
匹配换行符
f 匹配换页符
匹配回车符
匹配制表符
v 匹配垂直制表符
xxx 匹配以八进制数 xxxx 规定的字符
xdd 匹配以十六进制数 dd 规定的字符
uxxxx 匹配以十六进制 xxxx规定的 Unicode 字符

2.量词

控制字符出现的次数。

限定符描述
n* 匹配包含任何包含0个或者多个n的字符串
n+ 匹配包含任何包含至少1个n的字符串
n? 匹配包含0个或者1个n的字符串
n{x} 匹配包含任何包含x个n的字符串
n{x,} 匹配包含任何包含至少x个n的字符串
n{x,y} 匹配包含任何包含至少x个,至x个n的字符串
n$ 匹配任何以n结尾的字符串
^n 匹配任何以n开头的字符串

3.分组

一个中括号就代表一个字符,中括号的目的就是匹配某个特定字符。

分组说明
[abc] 查找一个在中括号中的任意一个字符
[abc] 查找一个不再中括号中的任意一个字符,^表示取反
[0-9] 查找一个任何从0至9的数字
[a-z] 查找一个任何从a至z的字母
[A-Z] 查找一个任何从A至Z的字母
[A-z] 查找一个任何从A至z的字母
[u4e00-u9fa5] 查找一个汉字

4.或

特殊符号:正则1|正则2, 或者。 符合或两边其中一个就可以匹配。

// 匹配三种其中一种字符串
var str1 = 'houfei111111'
var str2 = '000houfei222222'
var str3 = '000houfei3'
var reg1 = /^houfei1|houfei2|houfei3$/

console.log(reg1.test(str1)) // true
console.log(reg1.test(str2)) // true
console.log(reg1.test(str3)) // true

5.分组

// ()——提高匹配的优先级
// 组指的是一个小集体,分组就是将一个大集体可以分成几个小集体。
// 如:控制你的名字连续出现的次数,最少1次,最多3次
var reg = /^(小明){1,3}$/

6.贪婪匹配和惰性匹配

贪婪匹配,尽可能多的匹配;惰性匹配,仅仅匹配一次

str = '<p>a00</p><p>123</p>'
var re1 = str.match(/<p>[Ww]+?</p>/gi)
console.log('非贪婪模式:

1:' + re1[0] + '
2:' + re1[1])
// 1:<p>a00</p>
// 2:<p>123</p>

re1 = str.match(/<p>[Ww]+</p>/gi)
console.log('贪婪模式:

' + re1) // <p>a00</p><p>123</p>

re1 = str.match(/<p>(.+?)</p>/i)
console.log('非贪婪模式,且不要标记:

1:' + re1[1]) // 1:a00

re1 = str.match(/<p>(.+)</p>/i)
console.log('贪婪模式,且不要标记:

' + re1[1]) // a00</p><p>123

7.修饰符

// g,全称global,有 全局 的意思,表示全局匹配。
var reg = /hello/g
// i,全称ignore,有 忽视、忽略 的意思,表示匹配字母时,可以忽略字母的大小写。
var reg = /hello/i;

8.转义符

在正则中表示特殊符号。去除.的特殊意义,需要转义: .

// 验证邮箱  
^w{2,}@[0-9A-z]{2,}.[A-z]{2,3}$

// 验证身份证号
 /^(d{6}(18|19|20)d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{3}[0-9Xx]$)|(^(d{8}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{3}))$/
  
  // 验证手机号
^((13[0-9])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|147|166|198|199)\d{8}$

// 校验字母和汉字
/^[u4e00-u9fa5|a-zA-Z]+$/g

9.字符串对象方法

  • 正则对象.test(字符串) ; 用于检测字符串是否匹配某个规则。返回true和false。

  • 字符串.match(正则对象); 获取匹配正则的子字符串,返回一个数组。

  • 字符串.replace(正则对象,替换后的内容); 替换所匹配正则的子字符串。返回替换后的字符串。

  • 字符串.split(正则对象); 按照正则规则拆分字符串,返回一个数组。

  • 字符串.search(正则对象); 获取第一个匹配正则的子字符串的位置

// 匹配http:
let reg = /http:///;

// 测试
let str = '123456798as.txtdfgbbb.txt'
let reg = /.txt/ig
console.log(reg.test(str)) // true
console.log(str.match(reg)) // [".txt", ".txt"]
console.log(str.replace(reg, '***')) // 123456798as***dfgbbb***
console.log(str.split(reg)) // ["123456798as", "dfgbbb", ""]
console.log(str.search(reg)) // 11

将字符串中的部分字符替换为特殊字符

// 首位保留一位,末尾保留3位,中间全部替换为*,有多少字符替换多少
var re = /(.{1})(.*)(.{3})/
var str = '1234asdadsad567899'
str=str.replace(re,function(a,b,c,d){
  console.log(a,b,c,d) //1234asdadsad567899   1   234asdadsad567   899
  return b+c.replace(/./g,"*")+d;
});

正则替换不合法字符' " < >

/** 将text中的html字符转义, 仅转义  ', ", <, > 四个字符
  * @param  { String } str 需要转义的字符串
  * @returns { String }     转义后的字符串 
 */
function unhtml(str) {
    return str ? str.replace(/[<">']/g, (a) => {
        return {
            '<': '&lt;',
            '"': '&quot;',
            '>': '&gt;',
            "'": '&#39;'
        }[a]
    }) : '';
}
unhtml('<asfd45645sd4a<>">')

将手机号中间4位变成*

var re = /(.{3})(.*)(.{3})/
var str = '1234567899'
str=str.replace(re,function(a,b,c,d){
    return b+c.replace(/./g,"*")+d;
});

VUE 中绑定在input的keyup事件上,只允许输入特殊的字符

// 只允许输入 数字 和 Xx
this.idCard = this.idCard.replace(/[^(d|Xx)]/gi, '')

// 只允许输入 汉字
this.idCard = this.idCard.replace(/^[u4e00 -u9fa5]/g, '')

// 只允许输入 字母
this.idCard = this.idCard.replace(/[^A-z]/gi, '')

// 只允许输入 汉字 和 字母
this.idCard = this.idCard.replace(/[^(u4e00-u9fa5|a-zA-Z)]/gi, '')

// 只允许输入 .
this.idCard = this.idCard.replace(/[^(/.)]/gi, '')

// 只允许输入 数字 和 .
this.idCard = this.idCard.replace(/[^(0-9/.)]/g, '')

// 测试 只允许输入 金额 100.98
// this.idCard = this.idCard.replace(/^(d+(.d{2})?)$/g, '')
// if (/^(d+.d{1,2}|d+)$/.test(this.idCard)) {
//   console.log(true)
// } else {
//   console.log(false)
// }
// let id = this.idCard
// this.idCard = id.match(/d+(.d{0,2})?/) ? id.match(/d+(.d{0,2})?/)[0] : ''

一些数字规则总结

/*
1. 数字:/^d+$/ => /^d+$/.test('123')
2. n位数字: /^d{n}$/ => /^d{n}$/.test('123')
3. 至少n位数字: /^d{n,}$/ => /^d{n,}$/.test('1234')
4. m~n位数字: /^d{m,n}$/ => /^d{m,n}$/.test('12')
5. 0和非0开头的数字: /^(0|[1-9][0-9]*)$/ => /^(0|[1-9][0-9]*)$/.test('012')
6. 非零开头,最多带2位小数的数字: /^(0|[1-9][0-9]*)(.[0-9]{1,2})?$/ => /^(0|[1-9][0-9]*)(.[0-9]{1,2})?$/.test('0.12')
7. 带1-2位小数的正数或负数:/^(-|+)?(0|[1-9][0-9]*)(.[0-9]{1,2})?$/ => /^(-|+)?(0|[1-9][0-9]*)(.[0-9]{1,2})?$/.test('0.12')
8. 正数、负数和小数: /^(-|+)?(0|[1-9][0-9]*)(.[0-9]+)?$/ => /^(-|+)?(0|[1-9][0-9]*)(.[0-9]+)?$/.test('+900.0100')
9. 有2位小数的正实数: /^+?(0|[1-9][0-9]*)(.[0-9]{2})$/ => /^+?(0|[1-9][0-9]*)(.[0-9]{2})$/.test('+33.12')
10. 有1-3位小数的正实数: /^+?(0|[1-9][0-9]*)(.[0-9]{1,3})$/ => /^+?(0|[1-9][0-9]*)(.[0-9]{1,3})$/.test('+33.12')
11. 非零的正整数: /^+?[1-9]([0-9]+)?$/ => /^+?[1-9]([0-9]+)?$/.test('9')
12. 非零的负整数: /^-[1-9]([0-9]+)?$/ => /^-[1-9]([0-9]+)?$/.test('-90')
13. 非负整数: /^+?(0|[1-9][0-9]*)$/ => /^+?(0|[1-9][0-9]*)$/.test('+0')
14. 非正整数: /^-?(0|[1-9][0-9]*)$/ => /^-?(0|[1-9][0-9]*)$/.test('-9099')
*/
原文地址:https://www.cnblogs.com/houfee/p/10634637.html