最近接到一个内部搜索业务,本来是使用solr构建的分词搜索,但是在前期的数据量并没有那么大的情况下,使用者反馈使用分词反而不如精确匹配来的好用,所以运用相关正则表达式重写了一套搜索接口直接进行数据库检索,准备等数据量大起来以后再接入solr。在这个过程中使用了一些正则表达式,使用合适的工具做合适的事情果然可以事半功倍。所以收集并分享一下。


1.使用方法

此处不探究正则表格式更强大的功能,只讲述一下最常用的匹配,替换(相信大多数业务需求也正是这样)。

创建正则表达式

javaScript中一般创建正则表达式采取两种方式:

  • 字面量方法:直接使用字面量创建,在js解析器的性能上有一定优势,形式如下:

var reg = /ab+c/g

  • 构造函数方法:调用RegExp的构造函数进行初始化正则表达式,形式如下:

var reg = new RegExp('ab+c', 'g')

使用正则表达式

javaScript中有两个类(此处为了称呼方便说为类,实际上javaScript基于原型不存在类的概念)的6个方法可以使用到正则表达式,分别是:

类名 方法名
RegExp exec,test
String match, repalce, search, split
  • exec: exec() 方法用于检索字符串中的正则表达式的匹配。若匹配成功返回一个数组,其中存放匹配的结果;如果未找到匹配,则返回 null。 简而言之当结果数组不为null是表示匹配成功。

需要注意的是结果数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string

var myRe = /d(b+)d/g;
myRe.exec('cdbbdbsdbdbz') // ["dbbd", "bb", index: 1, input: "cdbbdbsdbdbz"]
myRe.exec('cdbbdbsdbdbz') // ["dbd", "b", index: 7, input: "cdbbdbsdbdbz"]
myRe.exec('cdbbdbsdbdbz') // null  
  • test:test() 方法用于检测一个字符串是否匹配某个模式。定义比较简单,与(r.exec(reg) != null)等价。
var str = 'hello world!';
var result = /^hello/.test(str); // true
result = (/^hello/.exec(str) != null); // true 与上式等价 
  • match:exec方法表现相似,差别在当为global匹配时结果为所有匹配结果,若不是则为第一个匹配结果(可以匹配的情况下)。
'cdbbdbsdbdbz'.match(/d(b+)d/g) // ["dbbd", "dbd"]
'cdbbdbsdbdbz'.match(/d(b+)d/) // ["dbbd", "bb", index: 1, input: "cdbbdbsdbdbz"]  
  • replace:replace方法是一个非常实用的方法,主要用来在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。有两个参数,第一个为匹配的正则表达式或者特定字符串,第二个参数是替换的字符串或者一个函数,该函数有四个可调用的参数,返回值为规定的字符串。参数如下:

第一个参数为每次匹配的全文本($&)。
中间参数为子表达式匹配字符串,个数不限.( $i (i:1-99))
倒数第二个参数为匹配文本字符串的匹配下标位置。
最后一个参数表示字符串本身。

// 将apples替换为oranges
var re = /apples/gi;
var str = 'Apples are round, and apples are juicy.';  // 第二个参数为字符串
var newstr = str.replace(re, 'oranges');
// oranges are round, and oranges are juicy.// 第二个参数为函数
var newstr = str.replace(re, function(value) {if(value == 'Apples') {return 'Oranges';}if(value == 'apple') {return 'oranges';}
});
// Oranges are round, and oranges are juicy.
  • search:search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,返回第一个匹配成功的字串起始位置。注意:忽略RegExp对象的lastIndex,每次执行均从头开始。
'cdbbdbsdbdbz'.search(/d(b+)d/) // 1
'xxx'.search(/d(b+)d/) // -1 没有匹配  
  • split:大多数人都知道split方法是用来对字符串按照指定子字符串进行分割返回数组的,但是很多人不知道它的参数可以是正则表达式,这无疑扩展了这个方法的能力。
var names = 'Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand ';
var re = /\s*;\s*/;
var nameList = names.split(re);
// [ "Harry Trump", "Fred Barney", "Helen Rigby", "Bill Abel", "Chris Hand " ]

基本的使用方法就是以上几种,接下来对常用的正则表达式进行一下总结。

2.常见表达式汇总

一、校验数字的表达式

1 数字:^[0-9]*$2 n位的数字:^\d{n}$3 至少n位的数字:^\d{n,}$4 m-n位的数字:^\d{m,n}$5 零和非零开头的数字:^(0|[1-9][0-9]*)$6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$7 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$   8 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$9 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$10 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$11 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$    12 非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$13 非负整数:^\d+$ 或 ^[1-9]\d*|0$14 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$15 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$16 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$17 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$18 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$19 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

二、校验字符的表达式

1 汉字:^[\u4e00-\u9fa5]{0,}$2 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$3 长度为3-20的所有字符:^.{3,20}$4 由26个英文字母组成的字符串:^[A-Za-z]+$5 由26个大写英文字母组成的字符串:^[A-Z]+$6 由26个小写英文字母组成的字符串:^[a-z]+$7 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$8 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$9 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$10 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$11 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+12 禁止输入含有~的字符:[^~\x22]+

三、特殊需求表达式

1 Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?3 InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$4 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$5 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$6 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}7 身份证号(15位、18位数字):^\d{15}|\d{18}$8 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$9 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$10 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$11 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$12 日期格式:^\d{4}-\d{1,2}-\d{1,2}13 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$14 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$15 xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$16 中文字符的正则表达式:[\u4e00-\u9fa5]17 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))18 空白行的正则表达式:\n\s*\r (可以用来删除空白行)19 HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)20 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)21 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)22 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)23 IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)24 IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

汇总参考: http://blog.csdn.net/IMW_MG/a...

附正则表:

正则表达式使用及常见表达式汇总相关推荐

  1. c语言常见表达式汇总(赋值表达式,条件表达式,关系表达式,算数表达式......)

    以下是一些常见的C语言表达式: 赋值表达式:用等号(=)将一个值赋给一个变量,例如:x = 5 算术表达式(数值表达式):使用算术运算符(+.-.*./)来执行算术运算,例如:x + y 关系表达式: ...

  2. Linux常见命令汇总(不定期更新)

    Linux常见命令汇总 文件及目录相关命令 命令名称 释义 ls 查看目录下的内容 cd 目录跳转 pwd 打印工作目录 cp 拷贝 mv 移动文件及目录 rm 删除文件及目录 mkdir 创建目录 ...

  3. Java常见知识点汇总

    Java常见知识点汇总 基础概念与常识 1.Java 语言有哪些特点? 2.JVM vs JDK vs JRE 3.什么是字节码?采用字节码的好处是什么? 4.为什么不全部使用 AOT 呢? 5.为什 ...

  4. 2021年全网最详细大数据常见端口汇总❤️【建议收藏】❤️

    目录 大数据常见端口汇总 一.Hadoop 二.Zookeeper 三.Hbase 四.Hive 五.Spark 六.Kafka 七.Flink 八.Flume 九.Redis 十.CDH 十一.HU ...

  5. mysql中常见错误代码汇总

    mysql中常见错误代码汇总: 我们操作mysql的时候经常会遇到一些错误并给出错误的代码,很难知道它是什么意思,下面给出常见的错误代码,方便查阅: 1005:创建表失败 1006:创建数据库失败 1 ...

  6. 全国计算机vb二级题型,全国计算机二级考VB机试常见题型汇总.doc

    全国计算机二级考VB机试常见题型汇总,计算机二级vb考试题型,计算机二级vb题型,vb二级考试题型,全国计算机二级vb题型,几何概型常见题型归类,线性规划的常见题型,解三角形常见题型,记叙文阅读常见题 ...

  7. 正则表达式学习笔记010--子表达式的认识与应用

    正则表达式学习笔记010--子表达式的认识与应用 交流群1:251572072 交流群2:170933152 子表达式: ()用2个小括号,括起来的叫做子表达式 如: \d{3,4}([\s|-]?\ ...

  8. Unity常见插件汇总

    Unity常见插件汇总 介绍 收集了相关的Unity插件,供大家学习使用,如果用于商业活动,请购买相关版权 插件列表 1. A* Pathfinding Project 一个功能强大并且易于使用的 U ...

  9. 机器学习常见术语汇总

    A 准确率(accuracy) 分类模型预测准确的比例.在多类别分类中,准确率定义如下: 在二分类中,准确率定义为: 激活函数(Activation function) 一种函数(例如 ReLU 或 ...

最新文章

  1. 敏捷开发原则与实践(二)
  2. 书山有径——走进清华大学图书馆
  3. Ubuntu16.04安装NVIDA显卡驱动
  4. pytorch笔记:VGG 16
  5. rsync+shell脚本完成自动化备份
  6. 函数参数-函数参数的使用以及作用
  7. 计算机上什么盘放大型游戏好,大型游戏可以直接装到移动硬盘里玩吗?
  8. VS2015配置OpenCV-contribu4.1.1及缺少xfeatures2d等无法打开包括文件: “features2d/test/test_detectors_regression.im问题
  9. win10支持8t 硬盘_详解win10硬盘如何直接安装
  10. DELL EMC Isilon配额Quota
  11. HDU 1275 两车追及或相遇问题(相遇和追及公式)
  12. Fresher的完美文本
  13. 树莓派4B连接PCF8591模块
  14. 一键拼接微信好友头像
  15. STM32F103C8T6以寄存器方式借助面包板搭建电路点亮LED流水灯详解
  16. 惠普电脑锁屏快捷键怎么设置?
  17. html5画布画出折线图,canvas 画出动态折线图
  18. 如何评估项目的开发时间
  19. Error: mkl-service + Intel(R) MKL: MKL_THREADING_LAYER=INTEL is incompatible with libgomp.so.1 libra
  20. 【STM32】 直插晶振

热门文章

  1. mysql字段说明_mysql 字段类型说明
  2. 辗转相除法求多项式的最大公因式
  3. 力扣——回文数(Java)
  4. mysql+io+参数_MySQL IO线程及相关参数调优
  5. 关于优酷开放SDK之onPrepareListener
  6. 【题解】luogu p1111 修复公路
  7. # # # 正则
  8. angularJS 修改操作select回显选中的数据
  9. linux内核多种进程间通信机制
  10. 绑定方法和非绑定方法