正则表达式,使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式,可用于文本搜索和文本替换。
匹配单个字符
- 直接输入字符。
- . 点匹配任意单一字符。
- 使用 \ 转义。
匹配多个字符
- 使用元字符 [ 和 ] 来定义一个字符集合。
- 合法的字符区间 0-9匹配所有数字 、A-Z、a-z、A-z会包含在Z和a之间的字符。
- 使用元字符 ^ 对一个字符集合进行取非匹配
重复匹配
- +匹配一个或多个字符
- *匹配零个或多个字符
- ?匹配零个或一个字符
- {和}用来设定重复次数
- 一个数字设定一个精确的值,例如{3}
- 两个数字设定一个区间,例如{2,4}
- 省略最大值,至少重复多少次,例如{3,}
- +和*都是贪婪型元字符,尽量多匹配,可以使用懒惰型版本,尽量少匹配。在贪婪型元字符后加上一个?。
- + 和 +?
- * 和 *?
- {3,}和{3,}?
可选标识符
- g: 全局匹配,即不是搜到一个匹配就返回,而是搜出全部匹配 一般返回是一个数组
- i: 忽略大小写
- m: 多行匹配
位置匹配
- \b单词边界,用来匹配一个单词的开头或结尾。(只有字母数字和下划线,也就是\w相匹配的字符可以构成单词,-不能)
- \B不匹配一个单词边界。\B-\B,要注意中间放的本身不是单词字符的情况。
- 字符串边界,^字符串开头,$字符串结尾。
- 分行匹配模式,使用(?m)记号启用分行匹配模式,该模式将换行视为字符串分隔,必须出现在整个模式的最前面。例如(?m)^\s*//.$,匹配JavaScript//注释。
子表达式
- 子表达式用(和)括起来,将被视为一个独立元素。
- 子表达式允许多层嵌套。
逻辑操作符
- |是或操作符,例如10|20将匹配10 或 20。
使用元字符
- 匹配空白字符
- \s任何一个空白字符,等价于[\f\n\r\t\v]
- \S任何一个非空白字符,等价于[^\f\n\r\t\v]
- 匹配数字
- \d 任何一个数字字符,等价于[0-9]
- \D 任何一个非数字字符,等价于[^0-9]
- 匹配字母和数字
- \w任何一个字母数字字符(不区分大小写)或下划线字符,等价于[a-zA-Z0-9_]
- \W任何一个非字母数字与非下划线字符,等价于[^a-zA-Z0-9_]
回溯引用:前后一致匹配
- \1代表着模式里的第一个子表达式。\2和\3依次类推。
- 在JavaScript中使用$1等来进行替换。
前后查找
- JavaScript只支持向前查找。
- (?=:)不会匹配到:,它表示:之前的内容。
- (?!:)表示向前查找取非。
正则表达式在JavaScript中的实现
方法
- exec: reg.test(str);
- match: str.match(reg)
- replace: str.replace(reg,"")
- search: str.search(reg);
- split: str.search(reg);
- test: reg.test(str)
- g选项激活全局搜索功能,i不区分字母大小写。
- m支持多行字符串,s支持单行字符串,x忽略正则表达式模式里的空白字符。
- 在使用回溯引用的时候,$' 返回匹配字符串前面的所有东西,$`返回被匹配字符串后面的所有东西,$+将返回最后一个匹配的子表达式,$&将返回被匹配到的所有东西。
- JavaScript提供了一个名为RegExp的全局对象,在执行完一个正则表达式后,可以通过这个对象获得这次执行有关的信息。
常用操作汇总
- 匹配结尾的数字 30CACDF40 (reg = /\d+$/g)
var str = "30CDE140";var reg = /\d+$/g;var dist = str.match(reg);if(dist){ console.log(dist[0]);}else{ console.log("error ");}复制代码
- 替换空格 测试 测试 (reg = /\s+/g )
var reg = /\s+/g;str.replace(reg,"");复制代码
- 判断字符串是不是由数字组成 7787729 ( reg = /^\d+$/g )
var reg = /^\d+$/g;reg.test(str);复制代码
- 电话号码 010-6532799 (reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/g)
var reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/g;reg.test(str);复制代码
- 校验密码强度 密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。
^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$复制代码
- 校验中文 字符串仅能是中文
^[\\u4e00-\\u9fa5]{0,}$复制代码
- 身份证
# 15位:^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$# 18位:^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$复制代码
- 校验日期 “yyyy-mm-dd“ 格式的日期校验,已考虑平闰年。
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$复制代码
- 手机号码 15210002180 ( reg = /^0*(13|15)\d{9}$/g )
- 删除字符串两侧的空格 测试 测试 (reg = /^\s+|\s+$/g)
- 删除字符串左侧的空格 测试 (reg = /^\s+/g)
- 删除字符串右侧的空格 测试 (reg = /\s+$/g)
- 限制文本框只能输入数字和小数点后两位 12.23(reg = /^\d*.?\d{0,2}$/g)
- “information.php?id=19”替换为"test.php?id=19" ( reg = /^\w*/gi )
- 匹配中文 ( reg = /[\u4E00-\u9FA5\uf900-\ufa2d]/gi )
- 匹配 中间的内容 ( reg = /
- [\s\S]+?
- 获取上传的图片文件名 C:\test\005.jpg ( reg = /[^\/]*[\/]+/g )
- 绝对路径变成相对路径 http://www.123.com/123/456 ( reg = /(http|https)://[^/]+/g )
- 用户名只能是中文、英文、数字、下划线、4-16字符
- ( reg = /^[\u4E00-\u9FA5\uf900-\ufa2d\w]{4,16}$/g )
- 匹配价格 ( reg = /^(\d*.\d{0,2}|\d+).*$/g )
- 匹配身份证号码 ( reg = /^(\d{14}|\d{17})(\d|[xX])$/ )a
- textarea 文本框限制成两行 ( reg = /\S+?\s*?[\n\r]\s*?\S+?/i )
- 验证日期格式 ( reg = /^\d{4}-\d{1,2}-\d{1,2}$/g )
- 去掉文件的后缀名 ( reg = /.\w+$/g )
- 匹配邮箱 ( reg = /\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+.)+[A-Za-z]{2,14}/g )
- 匹配链接 ( reg = /<a\s(\s*\w?=".+?")(\shref=".+?")(\s*\w*?=".+?")\s>[\s\S]*?</a>/ )
- 正则判断标签是否闭合 ( reg = /<([a-z]+)(\s*\w*?\s*=\s*".+?")(\s?>[\s\S]?(</\1>)+|\s/>)/i)
- 判断手机号是135开头的 ( reg = /^(135)(\d{8})$/g )
- 数字替换成大写数字 ( str.replace(/\d/g,function(m){return arr[m];}) )
- 替换字符串中的链接变成可点击的链接
- reg = /http://[w-](.[\w-])+/ig; str.replace(reg,function(m){return '';}))
- HTML代码段删除指定的标签及其内容 ( reg = /<(script|head|%)[\s\S]*oe?/\1>/ig )
- 给属性添加双引号 ( reg = /(\s+\w+)\s*=\s*([^"\s]+)(?=[^<>]*>)/ig)
- 匹配密码6-14位 ( reg = /^[\w.]{6,14}$/g )
- 非负整数:^\d+$
- 正整数:^[0-9][1-9][0-9]$
- 非正整数:^((-\d+)|(0+))$
- 负整数:^-[0-9][1-9][0-9]$
- 整数:^-?\d+$
- 非负浮点数:^\d+(.\d+)?$
- 正浮点数 : ^((0-9)+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])$
- 非正浮点数:^((-\d+.\d+)?)|(0+(.0+)?))$
- 负浮点数:^(-((正浮点数正则式)))$
- 英文字符串:^[A-Za-z]+$
- 英文大写串:^[A-Z]+$
- 英文小写串:^[a-z]+$
- 英文字符数字串:^[A-Za-z0-9]+$
- 英数字加下划线串:^\w+$
- E-mail地址:^[\w-]+(.[\w-]+)*@[\w-]+(.[\w-]+)+$
- URL:^[a-zA-Z]+://(\w+(-\w+))(.(\w+(-\w+)))(?\s)?$
- 或:^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&_~`@[]':+!]([^<>""])$
- 邮政编码:^[1-9]\d{5}$
- 中文:^[\u0391-\uFFE5]+$
- 电话号码:^(((\d{2,3}))|(\d{3}-))?((0\d{2,3})|0\d{2,3}-)?[1-9]\d{6,7}(-\d{1,4})?$
- 手机号码:^(((\d{2,3}))|(\d{3}-))?13\d{9}$
- 双字节字符(包括汉字在内):^\x00-\xff
- 匹配首尾空格:(^\s*)|(\s*$)(像vbscript那样的trim函数)
- 匹配HTML标记:<(.)>.</\1>|<(.*) />
- 匹配空行:\n[\s| ]*\r
- 提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\|/|.)+('|"| *|>)?
- 提取信息中的邮件地址:\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*
- 提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(\w|\|/|.)+('|"| *|>)?
- 提取信息中的IP地址:(\d+).(\d+).(\d+).(\d+)
- 提取信息中的中国手机号码:(86)013\d{9}
- 提取信息中的中国固定电话号码:((\d{3,4})|\d{3,4}-|\s)?\d{8}
- 提取信息中的中国电话号码(包括移动和固定电话):((\d{3,4})|\d{3,4}-|\s)?\d{7,14}
- 提取信息中的中国邮政编码:[1-9]{1}(\d+){5}
- 提取信息中的浮点数(即小数):(-?\d*).?\d+
- 提取信息中的任何数字 :(-?\d*)(.\d+)?
- IP:(\d+).(\d+).(\d+).(\d+)
- 电话区号:/^0\d{2,3}$/
- 腾讯QQ号:^[1-9][1-9][0-9]$
- 特殊字符:[`~!@%#$^&()=|{}':;',\[\].<>/?~!\@#¥……&()—|{}【】‘;:”“'。,、?'"\/\b\f\n\r\t\\]
- 帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
- 中文、英文、数字及下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$
- 匹配中文字符的正则表达式: [\u4e00-\u9fa5]
- 匹配双字节字符(包括汉字在内):[^\x00-\xff]
- 匹配空行的正则表达式:\n[\s| ]*\r
- 匹配HTML标记的正则表达式:/<(.)>.</\1>|<(.*) />/
- sql语句:^(select|drop|delete|create|update|insert).*$
- 匹配首尾空格的正则表达式:(^\s*)|(\s*$)
- 匹配Email地址的正则表达式:
[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?复制代码
API: http://www.runoob.com/js/js-regexp.html