JS RegExp 对象

1,273 阅读3分钟

概述

  • RegExp对象表示正则表达式,是由普通字符和特殊字符(也叫元字符或限定符)组成的文字模板
  • 用途:对字符串执行模式匹配

创建RegExp对象

构造函数

var 变量 = new RegExp("正则表达式","匹配模式");

字面量

var 变量 = /正则表达式/匹配模式;

使用typeof检查正则对象,会返回object

正则表达式语法

匹配模式

  • g:global 全局匹配
  • i:ignore case 忽略大小写匹配
  • m: multiple lines 多行匹配

基本元字符

  • . : 任何单个字符(除了换行和行结束符)
  • \: 转义字符,表示后一个字符不能从字面上解释
  • |: 或
  • []: 定义一个字符集合,匹配字符集合中的任意字符,/[abc]/等价于/a|b|c/
  • [^]: 对上面一个集合取非
  • -: 定义一个区间

特殊元字符

量词和位置

贪婪与懒惰(非贪婪)

正则表达式默认会匹配贪婪模式(尽可能多的匹配)。

开启懒惰模式(尽可能少的匹配):在量词后面加?

RegExp 对象方法

compile()

  • 用于在脚本执行过程中编译正则表达式
  • 也可用于改变和重新编译正则表达式。
RegExpObject.compile(regexp,i/g/gi);

exec()

  • 检索字符串中指定的值。返回找到的值,并确定其位置
  • 返回值:如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null
RegExpObject.exec(string);

test()

检索字符串中指定的值。返回 truefalse

RegExpObject.test(string);

支持正则表达式的 String 对象的方法

search()

检索与正则表达式相匹配的子字符串。

str.search(regexp);
  • 返回值:str第一个regexp 相匹配的子串的起始位置。如果没有任何匹配返回 -1。
  • search() 忽略标志 g。总是返回第一个匹配的位置。

match()

找到一个或多个正则表达式的匹配。

str.match(regexp);
  • 返回值:存放匹配结果的数组
  • 找到一个还是多个取决于全局标志g
  • 返回指定的值,而不是字符串位置。

repalce()

替换与正则表达式匹配的子串。

str.replace(regexp/substr,replacement)
  • 返回值:一个新的字符串
  • 设置全局标志 g,替换所有匹配子串。否则,只替换第一个匹配子串。
  • replacement 中的 $ 字符具有特定的含义。

split()

把字符串分割为字符串数组。

str.split(regexp,howmany)
//regexp:必需。从该参数指定的地方分割 
//howmany:可选。该参数可指定返回数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割。
  • 返回一个字符串数组。返回的数组中的字串不包括regexp自身

常用正则校验

用户名

//用户名正则,4到16位(字母,数字,下划线,减号)
var uPattern = /^[a-zA-Z0-9_-]{4,16}$/;

手机号码 /^1[3456789]\d{9}$/

function checkPhone(){ 
    var phone = document.getElementById('phone').value;
    if(!(/^1[3456789]\d{9}$/.test(phone))){ 
        alert("手机号码有误,请重填");  
        return false; 
    } 
}

url

var urlP= /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/;

身份证

// 身份证正则表达式(15位)
isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
// 身份证正则表达式(18位)
isIDCard2=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
身份证正则合并:(^\d{15}$)|(^\d{17}([0-9]|X)$)

密码强度

//密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
var pPattern = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;

整数

//正整数正则
var posPattern = /^\d+$/;
//负整数正则
var negPattern = /^-\d+$/;
//整数正则
var intPattern = /^-?\d+$/;

email

var ePattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;

中文

var cnPattern = /[\u4E00-\u9FA5]/;

车牌号

var cPattern = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/;

微信号

//微信号正则,6至20位,以字母开头,字母,数字,减号,下划线
var wxPattern = /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/;

日期

// 2020-01-20
var dP1 = /^\d{4}(\-)\d{1,2}\1\d{1,2}$/;

十六进制颜色

var cPattern = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/;