博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则表达式
阅读量:5903 次
发布时间:2019-06-19

本文共 5579 字,大约阅读时间需要 18 分钟。

正则表达式,使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式,可用于文本搜索和文本替换。

匹配单个字符

  1. 直接输入字符。
  2. . 点匹配任意单一字符。
  3. 使用 \ 转义。

匹配多个字符

  1. 使用元字符 [] 来定义一个字符集合。
  2. 合法的字符区间 0-9匹配所有数字 、A-Z、a-z、A-z会包含在Z和a之间的字符。
  3. 使用元字符 ^ 对一个字符集合进行取非匹配

重复匹配

  1. +匹配一个或多个字符
  2. *匹配零个或多个字符
  3. ?匹配零个或一个字符
  4. {和}用来设定重复次数
    • 一个数字设定一个精确的值,例如{3}
    • 两个数字设定一个区间,例如{2,4}
    • 省略最大值,至少重复多少次,例如{3,}
  5. +和*都是贪婪型元字符,尽量多匹配,可以使用懒惰型版本,尽量少匹配。在贪婪型元字符后加上一个?。
    • + 和 +?
    • * 和 *?
    • {3,}和{3,}?

可选标识符

  1. g: 全局匹配,即不是搜到一个匹配就返回,而是搜出全部匹配 一般返回是一个数组
  2. i: 忽略大小写
  3. m: 多行匹配

位置匹配

  1. \b单词边界,用来匹配一个单词的开头或结尾。(只有字母数字和下划线,也就是\w相匹配的字符可以构成单词,-不能)
  2. \B不匹配一个单词边界。\B-\B,要注意中间放的本身不是单词字符的情况。
  3. 字符串边界,^字符串开头,$字符串结尾。
  4. 分行匹配模式,使用(?m)记号启用分行匹配模式,该模式将换行视为字符串分隔,必须出现在整个模式的最前面。例如(?m)^\s*//.$,匹配JavaScript//注释。

子表达式

  1. 子表达式用(和)括起来,将被视为一个独立元素。
  2. 子表达式允许多层嵌套。

逻辑操作符

  1. |是或操作符,例如10|20将匹配10 或 20。

使用元字符

  1. 匹配空白字符
    • \s任何一个空白字符,等价于[\f\n\r\t\v]
    • \S任何一个非空白字符,等价于[^\f\n\r\t\v]
  2. 匹配数字
    • \d 任何一个数字字符,等价于[0-9]
    • \D 任何一个非数字字符,等价于[^0-9]
  3. 匹配字母和数字
    • \w任何一个字母数字字符(不区分大小写)或下划线字符,等价于[a-zA-Z0-9_]
    • \W任何一个非字母数字与非下划线字符,等价于[^a-zA-Z0-9_]

回溯引用:前后一致匹配

  1. \1代表着模式里的第一个子表达式。\2和\3依次类推。
  2. 在JavaScript中使用$1等来进行替换。

前后查找

  1. JavaScript只支持向前查找。
  2. (?=:)不会匹配到:,它表示:之前的内容。
  3. (?!:)表示向前查找取非。

正则表达式在JavaScript中的实现

方法

  1. exec: reg.test(str);
  2. match: str.match(reg)
  3. replace: str.replace(reg,"")
  4. search: str.search(reg);
  5. split: str.search(reg);
  6. 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]+?
    /gi )
  • 获取上传的图片文件名 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

转载于:https://juejin.im/post/5afa3ba251882567161ab421

你可能感兴趣的文章
深入屏幕像素概念
查看>>
彻底移除 IIS Response Header 版本信息
查看>>
linux下压缩与解压缩
查看>>
Laravel Response
查看>>
c语言中统计二进制位中1的个数的算法优化
查看>>
《C语言深度剖析》学习笔记四--指针
查看>>
awk命令的几个选项注释
查看>>
如何修改eclipse的默认工作空间
查看>>
cast return value to (void)
查看>>
简要总结我做过的一些项目
查看>>
用GLM库和GLSL编制最简单的三角形程序
查看>>
u-boot-201611 启动过程分析——基于smdk2410
查看>>
OpenCV图像的轮廓的匹配
查看>>
Windows更改临时文件夹
查看>>
Oracle 默认用户汇总
查看>>
mysql主从复制
查看>>
maven资源文件的相关配置
查看>>
Linux01-Linux启动流程及grub详解45
查看>>
Mac中使用Terminal启动Sublime Text 2
查看>>
TCP—重新传输数据
查看>>