前言:正则表达式(regular expression)反反复复学了多次,学了又忘,忘了又学,这次打算把基本的东西都整理出来,加强记忆,也方便下次查询。

学习正则表达式之前首先需要掌握记忆这些基本概念:

1.元字符:(.,\w,\W,\d,\D,\s,/S,^,$,)

字符 含义
. 匹配除了换行符以外的任意字符。
\s 代表任意空白符(换行符,制表符,空格)
\S 匹配任意非空字符串
\b 匹配单词边界,匹配单词的开头和结尾。
\B 匹配一个非单词边界
\d 匹配一个数字,等价于[0-9]
\D 匹配一个数字,等价于[^0-9]
\w 匹配一个单字字符(字母、数字或者下划线)等价于[A-Za-z0-9_],例如, /\w/ 匹配 "apple," 中的 'a',"$5.28,"中的 '5' 和 "3D." 中的 '3'。
\W匹配一个非单字字符。等价于[^A-Za-z0-9_],例如, /\W/ 或者 /[^A-Za-z0-9_]/ 匹配 "50%." 中的 '%'。
\W 匹配一个非单字字符。等价于[^A-Za-z0-9_],例如, /\W/ 或者 /[^A-Za-z0-9_]/ 匹配 "50%." 中的 '%'。
^ 匹配字符串的开始用在[]括号里面表示排除,/^A/ 并不会匹配 "an A" 中的 'A',但是会匹配 "An E" 中的 'A'。
$ 匹配字符串的结束。例如,/t$/ 并不会匹配 "eater" 中的 't',但是会匹配 "eat" 中的 't'。
QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$

我们发现\W加大写字母都是表示相反的意思。

 2.分组符([],(),{});

字符 含义
() 如果想要重复多个字符该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了。eg:
(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。
[] 代表一个字符集合。匹配方括号的中任意字符,包括转义序列。你可以使用破折号(-)来指定一个字符范围。对于点(.)和星号(*)这样的特殊符号在一个字符集中没有特殊的意义。他们不必进行转义,不过转义也是起作用的。例如,[abcd] 和[a-d]是一样的。他们都匹配"brisket"中得‘b’,也都匹配“city”中的‘c’。/[a-z.]+/ 和/[\w.]+/都匹配“test.i.ng”中得所有字符。
{} 表示量词的范围的。

3.修饰符(i,g,m);

字符 含义
i 忽略大小写
g 执行全局匹配
m 执行多行匹配

4.量词(*,?,+,-,{n,m},?=n,?!=n);

字符 含义
* 匹配任意次,.*连在一起就意味着任意数量的不包含换行的字符。等价于{0,}
+ 匹配前面一个表达式1次或者多次。等价于 {1,}。
? 匹配前面一个表达式0次或者1次。等价于 {0,1}。
{n,m} 匹配n到m次
x(?=y) 匹配'x'仅仅当'x'后面跟着'y'.这种叫做正向肯定查找。
例如,/Jack(?=Sprat)/会匹配到'Jack'仅仅当它后面跟着'Sprat'。/Jack(?=Sprat|Frost)/匹配‘Jack’仅仅当它后面跟着'Sprat'或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。
x(?!y) 匹配'x'仅仅当'x'后面不跟着'y',这个叫做正向否定查找。
例如,/\d+(?!\.)/匹配一个数字仅仅当这个数字后面没有跟小数点的时候。正则表达式/\d+(?!\.)/.exec("3.141")匹配‘141’但是不是‘3.141’

实例解析:
var reg = /\(?0\d{2}[) -]?\d{8}/。
“(”和“)”也是元字符,后面的分组节里会提到,所以在这里需要使用转义。
这个表达式可以匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等。我们对它进行一些分析吧:首先是一个转义字符\(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8})。

以下通过实例来讲解RegExp:

需求一:在一句话英文中匹配一个hi的单词。

  1. var str = 'Hi RegExp I love you so much Hi Hi hi';
  2. var reg = new RegExp("\\bhi\\b","gi");//g是一个修饰符,表示全局匹配。\b是一个元字符,代表单词边界,匹配单词的开头和结尾。
  3. //直接量语法:
  4. reg2 = /\bhi\b/gi;
  5. console.log(str.match(reg2));//['hi','hi','hi','hi']
  6. //升级
  7. //匹配hi后面不远处跟着一个lucy
  8. var strlc = /\bhi\b.*\blucy\b/;
  9. var luch = 'hi welcome to beijing lucy!!!';
  10. console.log(luch.match(strlc));

需求二:在一句话英文中匹配一个hi的单词。 

  1. var reg = /0\d\d\d-\d\d\d\d\d\d\d\d/;//\d代表一个数字,等价于[0-9],\D匹配一个非数字字符,等价于[^0-9]
  2. var tel = "0123-887523146";
  3. console.log(tel.match(reg));//0123-88752314;
  4. //这个连续写多次的方法很笨哎,所以引进了变量。
  5. regTel = /0\d{3}-\d{8}/;
  6. console.log(tel.match(regTel));//0123-88752314;

需求三:写一个清除字符串前后空格的正则表达式。

  1. String.prototype.trim = function(){return this.replace(/(^\s*)|(\s*$)/g, "");}
  2. var str2 = " hi space "//这里前后共有两个空格
  3. console.log(str2.length);//14
  4. console.log(str2.trim().length);//8
  5. console.log(str2.trim());//hi space

需求四:匹配一个邮箱。

  1. var eReg = /\S*@\S*\.\S*/;
  2. console.log(eReg.test('873619879@qq.com'))//true

更多实战用法

  1. // match的用法使用分组,且不使用g全局匹配
  2. // 语义: 找出首次匹配等号前后都是英文字母的字符串, 并返回分组内匹配的字符串。
  3. var str = '2019shanghai=nihao !! my_age=age18'
  4. console.log(str.match(/([A-Za-z]*)(=)[A-Za-z]+/))
  5. //下面是返回的结果
  6. /*[ 'shanghai=nihao',
  7. 'shanghai',
  8. '=',
  9. index: 4,
  10. input: '2019shanghai=nihao !! my_age=age18',
  11. groups: undefined ]
  12. */
  13.  
  14. const reg = /(jack)=([^&]*)/gi
  15. const str2 = 'Jack=gggg&Sprat=456'
  16. console.log(str2.match(reg))
  17. /*
  18. [ 'Jack=gggg',
  19. 'Jack',
  20. 'gggg',
  21. index: 0,
  22. input: 'Jack=gggg&Sprat=456',
  23. groups: undefined ]
  24. */
  25.  
  26. // 当一件事件你不知道做的时候,就将他们一个个分解,然后各个击破,先写出基本的,再去想办法怎么优化提升性能,缩减代码量之类
  27.  
  28. // 如何使用正则匹配一个不包含某一个字符的结果
  29. const reg2 = /([^g]*)(.*)/
  30. const str3 = 'yes you has do a good job'
  31. console.log(str3.match(reg2))
  32. /*
  33. [ 'yes you has do a good job',
  34. 'yes you has do a ',
  35. 'good job',
  36. index: 0,
  37. input: 'yes you has do a good job',
  38. groups: undefined ]
  39. */
  40.  
  41. // 正则表达式的使用,转化时间的格式
  42. const date = '2020-02-07'
  43. const regd = /(\d{4})-(\d{2})-(\d{2})/
  44. const newDate = date.replace(regd, '$1/$2/$3')
  45. console.log(newDate)//2020/02/07
  46.  
  47. //实例三
  48. var ary = ['一', '二', '三', '四', '五', '六']
  49. const newAry = '123456'.replace(/\d/g, function(i) {
  50. return ary[i - 1]
  51. })
  52. console.log(newAry)//一二三四五六
  53.  
  54. //获取url的参数
  55. function getQueryString(url, key) {
  56. const reg = new RegExp('(.*[?|&])' + key + '=([^&]*)(&|$)')// 点金之笔就在于([^&]*)一次就精准匹配出来了,比起上面的方法少了很多代码量
  57. var r = url.match(reg)
  58. if (r != null) return unescape(r[2])
  59. return null
  60. }
  61.  
  62. // x(?=y)的用法,匹配x后面是否跟着y,返回x的值
  63. const reg3 = /Jack(?=Sprat)/
  64. const str4 = 'JackSprat'
  65. console.log(str4.match(reg3))
  66. /*
  67. [ 'Jack', index: 0, input: 'JackSprat', groups: undefined ]
  68. */
  69.  
  70. // x(?!y),匹配x,当x后面不跟着y
  71. const reg4 = /\d{3}(?!\.)/
  72. const str5 = '3.145'
  73. console.log(str5.match(reg4))
  74. /*
  75. [ '145', index: 2, input: '3.145', groups: undefined ]
  76. */

参考文章:

https://deerchao.net/tutorials/regex/regex-1.htm

实例讲解js正则表达式的使用的更多相关文章

  1. 前端js常用正则表达式实例讲解

    本文内容整理自他人优秀的博客,非纯原创.仅借此学习和整理. 1.匹配用户名 规则描述: 长度4-6位: {4,16} 字母: [a-z] [A-Z] 数字: [0-9] 下划线: [_] 减号: [- ...

  2. JS正则表达式获取分组内容实例

    JS正则表达式获取分组内容. 支持多次匹配的方式: var testStr = "now test001 test002"; var re = /test(\d+)/ig; var ...

  3. 【正则】精通JS正则表达式,没消化 信息量太大,好文

    http://www.jb51.net/article/25313.htm 正则表达式可以: •测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用 ...

  4. JS正则表达式完整教程

    JS正则表达式完整教程(略长) 引言 亲爱的读者朋友,如果你点开了这篇文章,说明你对正则很感兴趣. 想必你也了解正则的重要性,在我看来正则表达式是衡量程序员水平的一个侧面标准. 关于正则表达式的教程, ...

  5. js正则表达式图形化工具-rline

    github地址:https://github.com/finance-sh/rline 在线demo: http://lihuazhai.com/demo/test.html 这是一个js正则表达式 ...

  6. JS正则表达式大全

    转自:http://wenku.baidu.com/link?url=3y930kC7F6D3wQdMjQ3fVDmiA9Wfebs_QK0UB3N3mFaEoKg4ytZORPopxufeYA6si ...

  7. js正则表达式replace里有变量的解决方法用到RegExp类

    一直比较害怕使用正则表达式,貌似很深奥很复杂的样子,所以在用js操作字符串的时候,我最多使用的是replace.split.substring.indexOf等函数,这些函数有时候需要多次叠加使用,但 ...

  8. JS正则表达式大全(整理详细且实用)

    JS正则表达式大全(整理详细且实用).需要的朋友可以过来参考下,希望对大家有所帮助!! 正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释, ...

  9. JS 正则表达式用法

    JS 正则表达式用法简介 简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具.其作用如下: 测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或 ...

随机推荐

  1. Django项目之小博客

    学习了几天Django,学着做了一个简易的小博客,主要用来练习Django基本的操作. 主要用到的命令和Django包.模块等: django.urls.url django.urls.import ...

  2. Python内存优化

    实际项目中,pythoner更加关注的是Python的性能问题,之前也写过一篇文章<Python性能优化>介绍Python性能优化的一些方法.而本文,关注的是Python的内存优化,一般说 ...

  3. eval浅解

    关于eval,你了解多少呢?来看看 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 需要一个参数(string),切必需.要计算的字符串,其中含有要计算的 JavaS ...

  4. Spring+mybatis 实现aop数据库读写分离,多数据库源配置

    在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库.Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询.因为在实际的应用中,数据库都是读多写少 ...

  5. Day-10: 错误、调试和测试

    程序运行时,会遇到各种各样的错误. 编写错误叫做bug,而另一类由于运行过程中无法预测的,比如写文件时,磁盘满了,写不进去:或者从网络抓取数据,网络突然掉了.这些错误称为异常,程序中需要对异常进行处理 ...

  6. 编程零基础应当如何开始学习 Python?

    提前说一下,这篇福利多多,别的不说,直接让你玩回最有手感的怀旧游戏,参数贴图很方便自己可以根据喜好修改哦. 本篇通过以下四块展开,提供大量资源对应. 选一个好版本 有没有看过<在下坂本,有何贵干 ...

  7. 1011. A+B和C (15)

    /*1011. A+B和C (15) 时间限制150 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者HOU, Qiming给定区间[-231, 231]内的3个整数A ...

  8. 关于js中单双引号以及转义符的理解

    关于js中单引号(')和双引号(")的使用以及转义的理解 这几天一直在画页面,身为开发人员的我之所以要画页面是因为当前项目中的页面上所有的东西都是从数据库中取得的,也就是动态的,类似于我们设 ...

  9. 四则运算 WEB

    coding.net:https://git.oschina.net/ysh0904/WEB.git 一.需求分析 记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算 ...

  10. 【Beta】阶段 第五次Daily Scrum Meeting

    每日任务 1.本次会议为第五次 Meeting会议: 2.本次会议在周五下午15:35,在禹洲楼召开,召开本次会议为10分钟. 一.今日站立式会议照片 二.每个人的工作 (有work item 的ID ...