正则 RegExp

441 阅读2分钟

JS中的正则

正则是处理字符串的 一种规则JS中的正则 具体体现出来是一种数据类型,正则数据属于引用数据类型

JS编写正则的两种方式:

  • 字面量的方式创建一个正则实例:var reg = /q/
  • new的方式创建 : var reg = new RegExp('q')

涉及到变量时候会偶尔用new的方式创建正则,一般都是字面量的方式

正则一般有两种用途:

  • 用于匹配test:编写一个正则,看对应的字符串是否符合该正则
  • 用于捕获exec:编写一个正则,可以把对应字符串中的符合规则的部分获取到

一个正则的组成

var reg = /-re/g 双斜杠中的内容 我们称为元字符,斜杠外边的内容我们称为修饰符

常用的元字符可以分为 有特殊含义的元字符量次元字符 普通元字符

有特殊含义的元字符:

 \        转义字符   把正则中有特殊含义字符转成字符本身 不再有任何特殊含义
 \d       代表0~9之间数字
 \D       代表除了0~9的任一字符
 \w       代表了 数字 字母 下划线
 \W       代表除了 数字 字母 下划线之外类的字符
 ^        代表以什么字符开头
 $        代表以什么字符结尾
 .        代表除了换行以外的所有字符
 \n       代表换行
 x|y      代表x或者y
 \t       代表制表
 [ab]     代表a或者b
 [^ab]    代表非ab
 [a-z]    代表a-z之间的任意字符
 [^a-z]   代表除了小写字母
 ()       分组和提升优先级
 (?:)     非捕获匹配
 (?=)
 (?!)

量词元字符:(一般都是用在其他元字符的后边)

 ?       代表前边的字符出现0 或者1次
 +       代表前边的字符出现一次或者多次
 *       代表前边的字符出现0 或者 多次
 {n}     代表前边字符出现n次
 {n,m}   代表前边的字符出现n到m次
 {n,}    代表前边的字符出现至少n次  n到多次

修饰符:

 i     忽略大小写  ignoreCase
 m     多行匹配    mutiline
 g     全局匹配    global   

举例说明:

  var str = '2019-9-23';
  str = str.replace(/-/g, '/');
  var ary = ['qqq', 'www', 'yyy'];
  var arr = ary.map(item => new RegExp(item)) ;
  console.log(arr);
var reg = /d/;
var reg = new RegExp('\d')
console.log(reg.test('qwert123456')) //false
console.log(reg.test('abcddd123456')) // true
var reg = /\d/;
var reg = new RegExp('\\d')
console.log(reg.test('qwert123456')) //true
console.log(reg.test('abcddd123456')) // true

var reg = /\\d/;
console.log(reg)
console.log(reg.test('qwert123456')) //false
console.log(reg.test('abc\\ddd123456')) // true

var reg = /\W/
console.log(reg.test('wreqwerafad1231___'))

var reg = /\d?/
console.log(reg.test('qerq23425fadfwrew'))//true


var reg = /\d{2}/
console.log(reg.test('qerq2fadfwrew')) // false
console.log(reg.test('qerq23fadfwrew'))// true
console.log(reg.test('qerq23425fadfwrew'))//true

var reg = /\d{2,}/
console.log(reg.test('qerq2fadfwrew')) // false
console.log(reg.test('qerq23fadfwrew'))// true
console.log(reg.test('qerq23425fadfwrew'))//true



var reg = /^d/
console.log(reg.test('qerq23425fadfwrew'))//false
console.log(reg.test('dddderq23425fadfwrew'))//true

var reg = /^\d/
console.log(reg.test('qerq23425fadfwrew'))//false
console.log(reg.test('dddderq23425fadfwrew'))//false

var reg = /^\w/
console.log(reg.test('qerq23425fadfwrew'))//true
console.log(reg.test('dddderq23425fadfwrew'))//true

var reg = /d$/;// 以 字符d结尾
console.log(reg.test('qerq23425fadfwrew'))//false
console.log(reg.test('dddderq23425fadfwrew'))//false
console.log(reg.test('ddd'))//true

var reg = /\d$/;  //以数字结尾 
console.log(reg.test('qerq23425fadfwrew'))//false
console.log(reg.test('dddderq23425fadfwrew'))//false
console.log(reg.test('ddd'))//false

var reg = /d+$/;// 以 字符d结尾
console.log(reg.test('qerq23425fadfwrew'))//false
console.log(reg.test('dddderq23425fadfwrewd'))// true
console.log(reg.test('ddd'))//true

var reg = /d*$/;// 以 字符d结尾
console.log(reg.test('qerq23425fadfwrew'))//true
console.log(reg.test('dddderq23425fadfwrewd'))// true
console.log(reg.test('ddd'))//true


var reg = /d{2}$/;// 以 字符d结尾
console.log(reg.test('qerq23425fadfwrew'))//false
console.log(reg.test('dddderq23425fadfwrewd'))// false
console.log(reg.test('ddd'))//true


var reg = /wd{2}$/;// 以俩d结尾 前边是个 w;
console.log(reg.test('qerq23425fadfwrew'))//false
console.log(reg.test('dddderq23425fadfwrewd'))// false
console.log(reg.test('ddd'))//false
console.log(reg.test('wddd'))//false
console.log(reg.test('dwdd'))//true


var reg = /^d$/; // 以d开头 以d结尾 中间是个d ; 就是个d
console.log(reg.test('dwerwed')) // false
console.log(reg.test('dddd')) // false
console.log(reg.test('d')) // true

var reg = /^dd$/; // 以前边的d开头 以后边d结尾 中间啥也没有 ; 就是个dd
console.log(reg.test('dwerwed')) // false
console.log(reg.test('dddd')) // false
console.log(reg.test('d')) // false


var reg = /^d\wd$/; // 以前边的d开头 以后边d结尾 中间是一个数字字母下划线 ; 
console.log(reg.test('dwerwed')) // false
console.log(reg.test('dddd')) // false
console.log(reg.test('d')) // false
console.log(reg.test('d_d')) // true
console.log(reg.test('ded')) // true
console.log(reg.test('d2d')) // true
console.log(reg.test('d.d')) // false

var reg = /^d\w+d$/; // \
console.log(reg.test('dwerwed')) // true
console.log(reg.test('dddd')) // true

var reg = /^dd{2,}d$/; // \
var reg = /^d{4,}$/
console.log(reg.test('dwerwed')) // false
console.log(reg.test('dwed')) // false
console.log(reg.test('dddd')) // true
console.log(reg.test('ddddddd')) // true

var reg = /(wd){2}$/ ;// 代表 以 两个 wd 结尾
console.log(reg.test('fasdfawdwd')) // true
console.log(reg.test('fasdfawdwdwd'))//true
console.log(reg.test('fasdfawd')) // false

var reg = /^\d.123$/;// 以一个数字开头 以3结尾前边是12 12前边是除了换行以外的任意字符
var reg2 = /^\d\.123$/
console.log(reg.test('123.123'))// false
console.log(reg.test('q123.123'))// false
console.log(reg.test('123q123'))// false
console.log(reg.test('123q.123'))// false
console.log(reg.test('q.123'))// false
console.log(reg.test('0q123')) // true


var reg = /^\d+.123$/;// 'n个数字 任意 123'
console.log(reg.test('123.123'))//true
console.log(reg.test('q123.123'))//false
console.log(reg.test('123q123'))//true
console.log(reg.test('123q.123'))//false


var reg = /[a-c]/; //  只要有一个 a或者b或者c ; 结果就是true
console.log(reg.test('aqweaqe'))
var reg = /^[a-c]/; //  只要以 a或者b或者c  开头的字符串; 结果就是true
var reg = /^[a-c]{2}/; //  只要以 a到c之间的任意两个字符开头的字符串 结果都是true;

var reg = /[a-z0-9]/; // 小写字母和数字
var reg = /[0-9a-z]/;// 小写字母和数字
var reg = /[0-9a-zA-Z_]/; // \w

var reg = /[.]/ // 中括号中的点 代表 点 本身;