前言

紧接着上次的js中的正则表达式(1),这一文搁在那很久了的,本文为初学者学习笔记心得,适用我这种小白,并不是什么高大尚的内容,您将在本文中看到,如何实现重复字符匹配,子表达式的使用,嵌套以及replace()方法中圆括号内第二个特殊参数的使用,欢迎路过的老师多提意见和指正

可以戳后链接js中的正则表达式(2)

重复字符匹配

  • x+:要想对同一个字符(或字符集合)进行多次重复匹配,只要给这个字符(或者字符集合)加上+字符作为后缀就可以了的,+匹配一个或多个字符(也就是至少一个,不匹配零个字符(大于零)的情况)

示例1:

var str =  "aaabbb";
var pattern = /a+/;
console.log(pattern.test(str)); // true
console.log(pattern.exec(str)); // aaa
复制代码

示例2:

   var str = "itclanCoder itclanCoder itclanCoder"var pattern = /(itclanCoder)+/console.log(pattern.test(str))  // true
复制代码

示例3:

  var str = 283714982423;var pattern= /[0-9]+/console.log(pattern.test(str));  // true注意:在给一个字符集合上+后缀的时候,必需把+字符放在这个集合的外面,比如[0-9]+是正确的,匹配一个或者多个连续的数字,而[0-9+]则不是,其实后面一个也是一个正确的正则表达式,只是含义不一样,它表示的是一个由数字0到9和+构成的字符集合,它只能匹配一个单个的数字字符或者加号,而+号是一个元字符,如果需要匹配+本身,就必须要使用它的转义`\+`
复制代码
  • *:匹配零个或多个字符(匹配一个可有可无的字符,也就是与之匹配的字符可以出现零次或多次的情况),用法与+一样,只要把它放在一个字符(或者一个字符集合)的后面,就可以匹配该字符(或字符集合)连续出现零次或多次的情况

示例1:

   var str = "川川 随笔川迹 itclanCoder"var pattern = /川*/console.log(pattern.test(str));  // true
复制代码

+与*的区别: +:匹配的是一个或者多个字符(或字符集合),也就是最少要匹配一次,至少有一个或者多个匹配,而*:匹配零个或者任意多个字符(或者字符集合),可以没有匹配 比如下面的两个实例应用区别:电子邮件的匹配规则 示例2:

   var str = www .itclanCoder@163.com is my emailvar pattern = /[\w.]+@[\w.]+\.\w+/console.log(pattern.exec(str))   // .itclanCoder@163.com/*[\w.]+表示匹配字符集合[\w.](也就是字母数字字符,下划线和.)的一次或多次重复出现,.itclanCoder显然符合这一个条件*/
复制代码

示例3:

   var str = www .itclanCoder@163.com is my emailvar pattern = /\w+[\w.]*@[\w.]+\.\w+/;console.log(pattern.exec(str));   // itclanCoder@163.com/*\w+:负责匹配电子邮件地止里的第一个字符(一个字母数字字符,但不包括.字符),[\w.]*表示匹配电子邮键地止里第一个字符之后,@字符之前的所有字符,这个部分可以包含零个或多个字母数字字符和.字符*/
复制代码
  • ?:匹配零个或一个字符,也就是说它只能匹配一个字符(或字符集合)的零次或一次出现,最多不超过一次

    应用场合:如果需要在一段文本里匹配某个特定的字符(或字符集合)而该出现字符可能出现,也可能不出现,?是最佳的选择

示例1:

   var str = "http://www.baidu.com and https:www.google.com"var pattern = /http[s]?/console.log(pattern.exec(str));  // http/**?:在这里的含义是,前面的一个字符(s)要么出现要么不出现,要么最多出现一次,也就是http[s]?既可以匹配http,也可以匹配https*/
复制代码

小结:问题:

  1. +,与*匹配的字符个数是没有上限的,无法为它们将匹配的字符个数设定一个最大的值
  2. +*?至少匹配零个或者一个字符,无法为他们将匹配的字符个数设定一个最小值
  3. 如果只是使用+*,无法把他们将匹配的字符个数设定为一个精确的数字
  • {}:匹配重复次数,把数值写在双大括号里面,用于限定次数

示例1:匹配重复多个字符/x{n}/

   var str = "Google";var pattern = /o{2}/   // 表示的是模式里前一个字符(或者字符集合)必须在所要匹配的文本里连续出现2次才算是一个匹配,如果只匹配了一次,那么不叫做一个匹配,匹配会失败console.log(pattern.exec(str)) // oo
复制代码

示例2:为重复匹配次数设定一个区间/x{m,n}/匹配x字符最少m次,最多n次

   var str = "google orange olive";var pattern = /o{2,4}/   // 模式匹配,o最少重复2次,最多重复4次console.log(pattern.exec(str));  // oo复制代码

示例3:重复匹配0次到n次/x{0,n}/,匹配字符x,0次..n次

    var str = "itclancoder itclancoder itclancoder"var pattern = /i{0,3}/  // 模式匹配i字符可以重复0次,1次,2次或者3次,这也明?=={0,1}console.log(pattern.exec(str)); // i
复制代码

示例4:匹配至少重复多少次:给出一个最小的重复次数,不必给出一个最大值/{n,}/至少重复n次,或者必须重复n次或者更多次

   var str = "jjjjbbbbbddddd";var pattern = /j{2,}/  // 模式匹配j字符至少重复2次,注意它只作用于紧挨着它的前一个字符console.log(pattern.exec(str)); // jjjj
复制代码

贪婪型元字符:*,+,{n,}

懒惰型元字符:*?,+?,{n,}?

什么是子表达式

概念:对表达式进行分组和归类,也是更大的表达式的一部分,把一个表达式划分为一系列子表达式的目的是为了把那些子表达式当做一个独立元素来使用 方式:子表达式必须用()括起来,注意,(左括号和右括号)是元字符,如果想要匹配本身,注意转义(和)

示例1:

   var str = "2018-01-13";var pattern = /(20|21)\d{2}/   // (20 |21)\d{2}正确匹配到2018,\d表示匹配任何一个数字字符,也就是[0-9],{2}表示的是重复匹配两次,以20或者21开头的任何一个4位数字将与这个模式匹配console.log(pattern.exec(str));  // 2018
复制代码

子表达式的嵌套

子表达式是允许多层嵌套的,没有限制,但是要适可而止,多重的嵌套子表达式可以构造出强大的正则表达式,但是由于层层嵌套,会让正则表达式难以阅读和理解,但硬骨头始终是要啃的,如果进行表达式的拆分,每次只分析和理解一个子表达式,按照先内后外的原则来进行拆分,而不是从第一个字符开始一个字符一个字符的去尝试,也许就会好很多 示例1:匹配一个合法的IP地止

    正则匹配要求:1. 任何一个1位或2位数字       (\d{1,2})2. 任何一个以1开头的3位数字   (1\d{2})3. 任何一个以2开头,第2位数字在0~4之间的3位数字  (2[0-4]\d)4. 任何一个以25开头,第3位数字在0~5之间的3位数字 (25[0-5])var  str = "12.159.46.240"var pattern = /(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))/console.log(pattern.exec(str)); // ["12.159.46.24", "46.", "46", "46", undefined, undefined, undefined, "24", "24", undefined, undefined, undefined, undefined, index: 0, input: "12.159.46.240"]
复制代码

这个模式相当的长而且看着非常繁琐而复杂,是由众多个子表单时嵌套构成,4个子表达式 ((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5])),从左边到右边,(\d{1,2})表示匹配任意一个1位或者两位数字(0-99),(1\d{2})表示的是一个以1开头的任意三位数(也就是100-199),(2[0-4]\d)表示匹配整数200-249,(25[0-5])表示的是匹配整数250-255,上面的长表达式通过|操作符结合成为一个更大的子表达式,其中含义是只需匹配4个子表达式中的任意一个就可以,而后面的\.用来匹配元字符.本身,而后面的{3}表示需要重复3次,直到最后,数值范围又重复了一次,此次过程省略了\.用来匹配IP地止里的最后一组数字,通过把4组数字的取值范围限制在0~255之间,这个模式就做到了只匹配合法的IP地止,不匹配非法的Ip地止

小结: 子表达式非常强大,也非常灵活,它是把同一个表达式的各个相关的部分组合在一起从而构成强大的匹配模式,子表达式必须用(右括号和左括号)来定义,并且子表达式可以多层嵌套使用 用途:对重复次数元字符的作用对象做出精准的设定和控制,对| 操作符的OR条件做出准确的定义等

replace()方法第二个参数的特殊字符使用

  • 语法:待检测字符串对象.replace(正则规则,要替换的文本或者功能函数),str.replace(pattern,fun);
  • 参数:圆括号内第一个参数表示正则规则,第二个参数可以是字符串也可以是函数,在 str中查找与RegExp(pattern)相匹配的子字符串,第二个参数值或者功能函数执行结果来替换这些子串,如果RegExp(pattern)具有全局标志g,那么replace()方法将替换所有匹配的子串,否则,它只替换第一个匹配子串(也就是说默认只会找第一个子串进行返回,若想全局替换,则要加g修饰符),replace()中的第二个参数,$字符具有特定的含义,它是从模式匹配得到的字符串将用于替换待检测字符串文本 返回:返回替换后的新字符串
  1. $$:把找到的子字符串用一个单独的$")
    var str = "itclancoder itclancoder";var pattern = /o/g;console.log(str.replace(pattern,"$$"));//itclanc$der itclanc$der
复制代码
  1. $&:使用第一个参数中所给定的子字符串来替换所找到的子字符串,例如:"itclanCoder itclanCoder".replace(/o/g,"$&"); // itclanCoder itclanCoder
    var str = "itclanCoder itclanCoder";var pattern = /o/g;console.log(str.replace(pattern,"$&")); //itclanCoder itclanCoder
复制代码
  1. $: 使用所找到的子字符串之前的文本来替换该子字符串(即处于匹配子串左侧的所有文本),例如:"itclanCoder itclanCoder".replace(/o/g/,"$");
   var str = "itclanCoder itclanCoder";var pattern = /i/g;console.log(str.replace(pattern,"$"));//$tclanCoder $tclanCoder
复制代码
  1. $1,$2,etc:当第一个参数中包含的正则表达式,使用小括号进行表达式分组,则可以实现提取出特定的表达式所匹配的子字符($1对应第一个小括号对的匹配项,$2对应第二个小括号对的匹配项,以此类推):比如:"Hello world".replace(/(o)(\s)/g,"$1$1$2"); //
   var str = "Hello world";var pattern = /(o)(\s)/;console.log(str.replace(pattern,"$1$1$2"));// Helloo world
复制代码

对于replace(正则规则,要替换的文本或者功能函数)方法中的第二个参数可以用函数的方式传入,而不只是一个字符串值,在这种情况下,原始字符串中每出现一项匹配的子字符串,都会执行一次该函数,并传入所匹配的子字符串,会使用函数的返回值来替换原子字符: 例如

    // 初始化一个值,用作计数器var count = 0;// 声明一个函数,当每找到一项匹配的子字符串时,执行该函数,函数的参数是所匹配的子字符本身function replaceWithCount(value){// 计数器加一count = count+1;// 将传入的值结合计数器当前的值返回至目标字符串,替换掉匹配的子字符串return value+count}//例子console.log("itclanCoder itclanCoder".replace(/o/g,replaceWithCount));// itclanCo1der itclanCo2derconsole.log("itclancoder itclanCoder".replace(/\s/g,replaceWithCount));// itclanCoder 3itclanCoder,其中这个\s匹配空白字符,即空格,tab制表符,回车符,换行符,换页符
复制代码

总结:

整篇文章主要是对上节的一个补充,正则的内容太长了,容易令人看到想吐,主要谈到利用x+进行重复匹配,也就是元字符加(+)的使用,以及用*匹配零个或多个字符,?:匹配零个或一个字符,只能匹配一个字符,对他们三者做了一个简单的比较,子表达式的使用,嵌套,replace()方法中第二个参数特殊字符的使用,以及作为函数时使用,而在平时当中,第二个参数作为函数处理是很常见的,当然正则是非常强大,远不止这点皮毛,反正我个人觉得,还是挺复杂的,往往通过正则写起来复杂的,用面向过程写法,逻辑更为复杂的,工具用好了,就是神器

以下是本篇提点概要

  • 重复字符匹配(x+)
  • *:匹配零个或多个字符
  • +:匹配的是一个或者多个字符(或字符集合),也就是最少要匹配一次,至少有一个或者多个匹配
  • +,与*一个比较,以及+,*,?三者比较
  • 什么是子表达式(对表达式进行分组和归类,也是更大的表达式的一部分,把一个表达式划分为一系列子表达式的目的是为了把那些子表达式当做一个独立元素来使用)
  • 子表达式的嵌套
  • replace()方法第二个参数的特殊字符使用

js中的正则表达式(2)相关推荐

  1. html js脚本限制 正则,简单谈谈JS中的正则表达式

    1.正则表达式包括两部分 ①定义正则表达式的规则: ②正则表达式的模式(i/g/m): 2.声明正则表达式 ① 字面量声明: var reg = /表达式规则/表达式模式: eg:var reg = ...

  2. 如何在JS中应用正则表达式

    背景:在之前的随笔中写过C#中如何使用正则表达式,这篇随笔主要讲如何在js中应用正则表达式 如下代码: 1 $("#zhengze").click(function () { 2 ...

  3. js中字符串正则表达式、正则法则pattern、RegExp、flags、exec

    全栈工程师开发手册 (作者:栾鹏) js系列教程3-字符串.正则表达式全解 js中字符串正则表达式 正则法则的应用 正则表达式 = /pattern/flags 其中flags中g表示匹配全部,i表示 ...

  4. 前端开发:JS中关于正则表达式的使用汇总

    前言 在前端开发过程中,关于正则表达式的使用也是必备技能,尤其是在实际业务需求的时候,需要处理一些不能按照正常语句操作的逻辑,如前端开发中的字符匹配.参数处理等都需要正则表达式来匹配截取处理.虽然正则 ...

  5. 注意判断js中使用正则表达式的转义字符,到底是对谁进行转义!!!

    前言: 前一段时间,对如下一段特殊符号进行测试,js中有一段代码如下: [`~!@#$^&*()=|{};:'".,[\]./?~@#&*{}] 结果发现不能匹配\,于是没有 ...

  6. php中正则表达式用法,php与js中的正则表达式用法

    1. php中的正则: if(preg_match('/^[^x00-xff]+$/', $_POST['password']) || !preg_match('/^\w+$/', $_POST['p ...

  7. JS中关于正则表达式的一些个人理解

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

  8. Java和Js中的正则表达式

    什么是正则表达式? 正则表达式(Regular Expression)就是用某种模式去匹配一类字符串的公式.如你要在一篇文章中查找第一个字是"罗"最后一个字是"浩&quo ...

  9. js中的正则表达式入门

    什么是正则表达式呢? 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串.将匹配的子串做替换或者从某个字符串中取出符合某个条件的子串等 ...

最新文章

  1. 结构感知图像修复:ICCV2019论文解析
  2. 服务器Jmail配置问题
  3. VS2015编译Boost1.64
  4. 在Metro App中显示Toast notification
  5. x265-确定slice type-2
  6. asp.net 检测访问者是iphone,android,web(摘录)
  7. 普通人学python好吗_有人问,普通人学python真的有意义吗?看看大家都是怎么说的吧...
  8. oracle没有自带的程序吗,oracle – 空包定义(没有公共成员)
  9. vue不是内部或外部命令_vue脚手架
  10. 【渝粤题库】陕西师范大学290001 计算机网络
  11. Julia: 读出目录下所有文件
  12. 给大家介绍一款相亲交友小程序
  13. echarts官网下载源码文件一直失败,在这里直接复制源码
  14. 泛函分析笔记08:有界线性算子和泛函介绍与共鸣定理
  15. 非常高兴可以订购到龙芯电脑
  16. eclipse快捷键以及使用技巧大全
  17. 核密度函数加权直方图的计算
  18. Foreground-aware Pyramid Reconstruction for Alignment-free Occluded Person Re-identification
  19. 合理使用DTO(Data Transfer Object)
  20. 基于html的网页设计毕业论文,个人主页设计(网页设计毕业论文)

热门文章

  1. linux查询机器信息,linux_机器信息查询
  2. 电脑的基础知识_电脑的基础知识大全,你确定都知道?
  3. mysql主从 dump线程_MySQL主从复制线程状态转变
  4. java连接mysql数据库时出现乱码_java连接mysql数据库中文乱码问题
  5. 中等职业教育计算机,计算机应用基础:Windows7+Office2010(中等职业教育规划教材)...
  6. error C3646: “noexcept”: 未知重写说明符_三个世纪以来首次发现:大脑中还藏着一种未知的器官?...
  7. REACT是否真的就比VUE强?(文末附两个框架的学习福利)
  8. 单机上搭建Node集群
  9. 计算机vfp程序设计题,2012年计算机级VFP程序设计基础习题及答案.doc
  10. 添加ejs后页面空白解决办法