整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JavaScript 正则表达式

则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。

搜索模式可用于文本搜索和文本替换。


什么是正则表达式?

正则表达式是由一个字符序列形成的搜索模式。

当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。

正则表达式可以是一个简单的字符,或一个更复杂的模式。

正则表达式可用于所有文本搜索和文本替换的操作。

语法

/正则表达式主体/修饰符(可选)

其中修饰符是可选的。

实例:

var patt = /runoob/i

实例解析:

/runoob/i 是一个正则表达式。

runoob 是一个正则表达式主体 (用于检索)。

i 是一个修饰符 (搜索不区分大小写)。


使用字符串方法

在 JavaScript 中,正则表达式通常用于两个字符串方法 : search() 和 replace()。

search() 方法 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。

replace() 方法 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。


search() 方法使用正则表达式

实例

使用正则表达式搜索 "Runoob" 字符串,且不区分大小写:

varstr = "Visit Runoob!"; varn = str.search(/Runoob/i);

输出结果为:

6


search() 方法使用字符串

search 方法可使用字符串作为参数。字符串参数会转换为正则表达式:

实例

检索字符串中 "Runoob" 的子串:

varstr = "Visit Runoob!"; varn = str.search("Runoob");


replace() 方法使用正则表达式

实例

使用正则表达式且不区分大小写将字符串中的 Microsoft 替换为 Runoob :

varstr = document.getElementById("demo").innerHTML; vartxt = str.replace(/microsoft/i,"Runoob");

结果输出为:

Visit Runoob!

replace() 方法使用字符串

replace() 方法将接收字符串作为参数:

varstr = document.getElementById("demo").innerHTML; vartxt = str.replace("Microsoft","Runoob");


正则表达式修饰符

修饰符 可以在全局搜索中不区分大小写:

正则表达式参数可用在以上方法中 (替代字符串参数)。

正则表达式使得搜索功能更加强大(如实例中不区分大小写)。

修饰符描述
i执行对大小写不敏感的匹配。
g执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m执行多行匹配。

正则表达式模式

方括号用于查找某个范围内的字符:

表达式描述
[abc]查找方括号之间的任何字符。
[0-9]查找任何从 0 至 9 的数字。
(x|y)查找任何以 | 分隔的选项。

元字符是拥有特殊含义的字符:

元字符描述
\d查找数字。
\s查找空白字符。
\b匹配单词边界。
\uxxxx查找以十六进制数 xxxx 规定的 Unicode 字符。

量词:

量词描述
n+匹配任何包含至少一个 n 的字符串。
n*匹配任何包含零个或多个 n 的字符串。
n?匹配任何包含零个或一个 n 的字符串。

使用 RegExp 对象

在 JavaScript 中,RegExp 对象是一个预定义了属性和方法的正则表达式对象。


使用 test()

test() 方法是一个正则表达式方法。

test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。

以下实例用于搜索字符串中的字符 "e":

实例

var patt = /e/;

patt.test("The best things in life are free!");

字符串中含有 "e",所以该实例输出为:

true

你可以不用设置正则表达式的变量,以上两行代码可以合并为一行:

/e/.test("The best things in life are free!")


使用 exec()

e

4小时制时间(HH:mm:ss)

/^((?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$)/

12小时制时间(hh:mm:ss)

/^(1[0-2]|0?[1-9]):[0-5]\d:[0-5]\d$/

base64格式

/^\s*data:([a-z]+\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*?)\s*$/i

数字/货币金额(支持负数、千分位分隔符)

/(^[-]?[1-9]\d{0,2}($|(,\d{3})*($|(\.\d{1,2}$))))|((^[0](\.\d{1,2})?)|(^[-][0]\.\d{1,2}))$/

数字/货币金额 (只支持正数、不支持校验千分位分隔符)

/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/

银行卡号(16或19位)

/^([1-9]{1})(\d{15}|\d{18})$/

中文姓名

/^([\u4e00-\u9fa5·]{2,10})$/

新能源车牌号

/[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领 A-Z]{1}[A-HJ-NP-Z]{1}(([0-9]{5}[DF])|([DF][A-HJ-NP-Z0-9][0-9]{4}))$/

非新能源车牌号

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

车牌号(新能源+非新能源)

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

URL链接(网址)

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

手机号(严谨), 根据工信部2019年最新公布的手机号段

/^1((3[\d])|(4[5,6,7,9])|(5[0-3,5-9])|(6[5-7])|(7[0-8])|(8[\d])|(9[1,8,9]))\d{8}$/

手机号(宽松), 只要是13,14,15,16,17,18,19开头即可

/^1[3-9]\d{9}$/

手机号(最宽松), 只要是1开头即可, 如果你的手机号是用来接收短信, 优先建议选择这一条

/^1\d{10}$/

日期, 如: 2000-01-01或2000-1-1

/^\d{4}(-)([0-1][0-2]|\d)\1([0-2]\d|\d|30|31)$/

email地址

/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/

国内座机电话,如: 0341-86091234

/\d{3}-\d{8}|\d{4}-\d{7}/

一代身份证号(15位数字)

/^\d{8}(0\d|11|12)([0-2]\d|30|31)\d{3}$/

二代身份证号(18位数字),最后一位是校验位,可能为数字或字符X

/^\d{6}(18|19|20)\d{2}(0\d|11|12)([0-2]\d|30|31)\d{3}(\d|X|x)$/

身份证号, 支持1/2代(15位/18位数字)

/(^\d{8}(0\d|11|12)([0-2]\d|30|31)\d{3}$)|(^\d{6}(18|19|20)\d{2}(0\d|11|12)([0-2]\d|30|31)\d{3}(\d|X|x)$)/

帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线组合

/^[a-zA-Z][a-zA-Z0-9_]{4,15}$/

纯中文/汉字

/^[\u4E00-\u9FA5]+$/

是否小数

/^\d+\.\d+$/

电话(座机)

/^0\d{2,3}-\d{7,8}$/

纯数字

/^\d{1,}$/

是否html标签

/<(.*)>.*<\/\1>|<(.*) \/>/

是否qq号格式正确

/^[1-9][0-9]{4,10}$/

是否由数字和字母组成

/^[A-Za-z0-9]+$/

纯英文字母

/^[a-zA-Z]+$/

纯小写英文字母组成

/^[a-z]+$/

纯大写英文字母

/^[A-Z]+$/

密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符

/^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/

用户名正则,4到16位(字母,数字,下划线,减号)

/^[a-zA-Z0-9_-]{4,16}$/

ipv4地址正则

/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/

16进制颜色

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

微信号,6至20位,以字母开头,字母,数字,减号,下划线

/^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/

中国邮政编码

/^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$/

只包含中文和数字

/^(([\u4E00-\u9FA5])|(\d))+$/

非字母

/[^A-Za-z]$/

链接:https://juejin.im/post/5d245d4151882555300feb77

来源:掘金


、什么是正则表达式(regular expression)

1) 正则表达式是一描述字符模式的对象;

2) 可以处理更复杂的字符串;

3) javaScript中的正则表达式使用RegExp对象表示;

4)正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的工具;

1.语法:var patt=new RegExp(pattem,modifiers) 动态创建表达式

Var patt=/patterm/modifiers;

2.参数:pattern:描述表达式模式

Modifiers:用于指定全局匹配、区分大小写的匹配和多行匹配;

3.常用修饰符:用于执行区分大小写和全局匹配

1)i 执行对大小写不敏感的匹配;

2)g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止);

3)m 执行多行匹配

4.方括号:用于查找某个范围内的字符

 1)[abc]:查找方括号之间的字符;
 
 2)[^abc]:查找任何不在方括号之间的字符;
 
 3)[0-9]:查找任何从0至9的数字;
 
 4)[a-z]:查找任何从小写a到小写z的字符;
 
 5)[A-Z]:查找任何从大写A到大写Z的字符;
 
 6)[A-z]:查找任何从大写A到小写z的字符;
 
 7)[adgk]查找给定集合内的 任何字符;
 
 8)[^adgk]:查找给定集合外的任何字符;
 
 9)(red|blue|green):查找任何指定的选项;

5.元字符:(Metacharacter)是拥有特殊含义的字符;

 1). :查找单个字符,除了换行和结束符;
 
 2)\w:查找单词字符;
 
 3)\W:查找非单词字符;
 
 4)\d:查找数字;
 
 5)\D:查找非数字字符;
 
 6)\s:查找空白字符;
 
 7)\S:查找非空白字符;
 
 8)\b:匹配单词边界;
 
 9)\B:匹配非单词边界;
 
10)\0:查找NUL字符;

11)\n:查找换行符;

12)\f:查找换页符;

13)\r:查找回车符;

14)\t:查找制表符;

15)\v:查找垂直制表符;


16)\xxx:查找以八进制数xxx规定的字符;
17)\xdd:查找以十六进制数dd规定的字符;
18)\uxxxx:查找以十六进制数xxxx规定的Unicode字符;

6.量词:

  1)n+:匹配任何包含至少一个n的字符串;
  
  2)n*:匹配任何包含零个或多个n的字符串;
  
  3)n?:匹配任何包含零个或一个n的字符串;
  
  4)n{x}:匹配包含X个n的序列的字符串;
  
  5)n{X,Y}:匹配包含X或Y个n的序列的字符串;
  
  6)n{X}:匹配包含至少X个n的;
  
  7)n$:匹配任何结尾为n的字符串;
  
  8)^n:匹配任何开头为n的字符串;
  
  9)?=n:匹配任何其后紧接指定字符串n的字符串;
  
 10)?!n:匹配任何其后没有紧接指定字符串n的字符串;

二、正则对象方法:

1.RegExp对象

1)compile(编译)
语法:ReExpObject.compile(regexp,modifier)
参数:regexp:正则表达式  modifier:模式修饰符;
Compile:用于在脚本执行过程中编译正则表达式或改变和重新编译正则表达式
2)exec:在目标字符串中执行一次正则匹配操作,并将结果以数组的形式返回,每次执行 exec()函数都只查找最多一个匹配并返回
语法:RegExpObjec.exec(string)
参数:string指定的字符串;

注:~如果为正则表达式设置了全局标志(g),exec()函数仍然只返回最多一个匹配,不过我们再次调用该对象的exec()函数就可以查找并返回下一个匹配;

~如果为正则表达式设置了全局标识g,test函数仍然只查找最多一个匹配,不过我们再次调用该对象的test函数就可以查找下一个匹配;

~如果regExpObject带有全局标志g,test()函数不是从字符串的开头开始查找,而是从属性regExpObject.lastIndex所指定的索引处开始查找该属性值默认为0,所以第一次仍热按是从字符串的开头查找。当找到一个匹配是,test()函数会将regExpObject.lastIndex的值改为字符串中能够本次匹配内容的最后一个字符的下一个索引位置,当再次执行test()函数是,将会从该索引位置处开始查找,从而找到下一个匹配。

~当我们使用test()函数执行了一次匹配之后,如果想要重新使用test()函数从头开始查找,则需要手动将regExpObject.lastIndex的值重置为0,如果test()函数在也找不到可以匹配的文本时,该函数会自动把regExpObject.lastIndex属性重置为0

3)test(测试):检测字符串中是否存在正则表达式模式对应的匹配,返回值布尔型;
语法: regExpObject.test(str)
参数:string指定的字符串

注:每次执行test函数都只查找最多一个匹配,找到返回true,否则false

2.正则表达式string对象的方法:如果匹配成功,则search()返回正则表达式在字符串中首次匹配项的索引,否则,返回

1)search(搜索):如果匹配成功,则search()返回正则表达式在字符串中首次匹配项的索引,否则,返回-1
 语法:str,search(regexp)
 参数:regexp一个正则表达式对象,如果传入一个非正则表达式对象,则会使用new RexExp(obj)隐式地将其转换为正则表达式

注:~~想知道字符串中是否建瓯存在某个模式(pattem)时可使用search,类似于正则表达式的test方法

~~了解更多匹配信息是,可使用match(会更慢),该方法类似于正则表达式的exec方法

2)match:当字符串匹配到正则表达式(regular expression)时,match()方法会提取匹配项,如果找到返回匹配结果的数组,如果没有匹配项,则返回null
语法:str,match(regexp)
参数:regexp一个正则表达式对象,如果传入一个非正则表达式对象,则会隐式地使用new RegExp(obj)将其转换为正则表达式对象
 3)replace(替换):replace()方法使用一个替换值(replacement)替换掉一个匹配模式(pattem)在原字符串中某些或所有的匹配项,并返回替换后的字符串。这个替换模式可以是字符串或者RegExp(正则表达式),替换值可以是一个字符串或者一个函数

 语法:str.replace(regexp|substr,newSubStr|function)

参数:regexp,一个RegExp对象,该正则所匹配的内容会被第二个参数的返回值替换掉   

           Substr:一个要被newSubSTR替换的字符串
           
           newSubStr:替换掉第一个参数在原字符串中的匹配部分,该字符串中可以内插一些特殊的变量名
           
           function:一个用来创建新字符串的函数,该函数的返回值将替换掉第一个参数匹配到的结果注:~~该方法并不改变调用它的字符串本身,而只是返回替换后的字符串
       ~~在进行全局的搜索替换时,第一个参数要么是包含g标志的正则表达式,要么是包含g标志的字符串;
4)split(分割):split()方法通过吧字符串分割成字符串来把一个String对象分割成一个字符串数组
语法:str.split([separator][,limit])
参数:separator,指定用来分割字符串的字符,separator可以是一个字符串或正则表达式,如果忽略separator,则返回的数组包含一个由原字符串组成的元素,如果separator是一个空字符串,则str将会转换成一个由原字符串中字符组成的数组;
           Limit:一个整数,限定返回的分割片段数量,split方法仍然分割每一个匹配的sepparator,单数返回的数组只会截取最多limit个元素

注:~~当找到一个seperator时,sparator会从字符串中被移除,返回存进一个数组当中的字符串,如果忽略separator参数,则返回的数组包含一个元素,该元素是原字符串,如果separator是一个空字符串,则str将被转换为由字符串中字符组成的数组

~~如果separator是一个正则表达式,且包含捕获括号(capturing parentheses),则每次匹配到separator时,捕获括号匹配的结果将会插入到返回的数组中。

还有,既然学习了正则表达式,就千万不要忘记这一个用法: