您现在的位置是:首页 > 正文

RegExp对象的学习

2024-02-01 01:00:11阅读 2

1.科普:RegExp是js原生的内置对象,直接可以使用。e.g. :via RegExp.$1 取得第一个匹配子项;

        默认带特殊含义的字符若要表达其本身就在其前面加个\转义,这些字符共有11个:{} [] ()  *  +  .  ?\反斜杠转义   或|  头^ 尾$ ,(如果记不住,伸出你的双手,每个手指绑定一个符号就轻松搞定10个了呢,如果还是记不住,那就罚抄10遍吧,哈哈哈)

2.实例:正则对象的exec() 执行后返回一个匹配结果的数组 或者null,例如:

       var matches = /(#)(.*)/g.exec("#id") ; // 返回一个数组

       详解:(#)==  RegExp.$1    ,   (.*)  ==  RegExp.$2       

        RegExp.$0是什么呢?RegExp.$0 == "#id"  就是被exec的原始字符串

3.简写/indus(try|tries)/ 等价于/indus(?:try|tries)/,可取得(?:try|tries)的匹配值

          /indus(?:try|tries)/g.exec("industries")    // industries   

          /indus(try|tries)/g.exec("industries")   // industries

          匹配结果如下图: 

         

4.不会获取(?=home)的匹配,它只是一种匹配模式(正向肯定预查,正向否定预查,反向肯定预查,反向否定预查)

       4.1:正向肯定预查,执行结果不包含正则中()的内容,例如:

       var matches = /go(?=home)/g.exec("gohome gohomee nogohome")   // matches [0] = go

       

        正向肯定预查被广泛用于String对象replace()替换某些字符,例如:     

var str = "goxhome gohome"
var result = str.replace(/(go)(?=home)/g,"'$1out'")  // result  = "goxhome 'goout'home"

          4.2:正向否定预查,执行结果不包含正则中(?!home)的内容,例如:全局g将多次执行exec

let result;
let strObj = "gohome goxhome goyhome";
let regexp = /go(?!home)/g;
result = regexp.exec(strObj);
console.log("result=",result[0]); // go
console.log("lastIndex=",regexp.lastIndex); // 9
result = regexp.exec(strObj);
console.log("result=",result[1]); // go
console.log("lastIndex=",regexp.lastIndex); // 17

           4.3:反向肯定预查,执行结果不包含正则中(?<=on)的内容,例如: 全局g将多次执行exec

let result;
let strObj = "undertable ontable besidetable";
let regexp = /(?<=on)table/g;
result = regexp.exec(strObj);
console.log("result=",result);// table
console.log("lastIndex=",regexp.lastIndex); // 18
result = regexp.exec(strObj);
console.log("result=",result); // null
console.log("lastIndex=",regexp.lastIndex);// 0

            4.4:反向否定预查,执行结果不包含正则中(?<!on)的内容,例如: 全局多次执行exec

let result;
let strObj = "undertable ontable besidetable";
let regexp = /(?<!on)table/g;
result = regexp.exec(strObj);
console.log("result=",result); // table
console.log("lastIndex=",regexp.lastIndex); // 10
result = regexp.exec(strObj);
console.log("result=",result); // table
console.log("lastIndex=",regexp.lastIndex);// 30

new RegExp的要点:

new RegExp("\\w",“gi”) 等价于 /\w/gi 

new RegExp(“\\w”,“gim”)如果是g(全局匹配,如果没g,即使循环.exec一万次,仍只重复得到‘匹配到的第一个结果’),则要循环才能匹配出所有结果。因其本身即使有多个结果,但它一旦找到结果就会停下,所以要循环执行某个正则对象的exec去找。

lastIndex是最近一次匹配结果的index+1位。

全局exec示例:

var str = "Visit W3School, W3School is a place to study web technology."; 
var patt = new RegExp("W3School","g"); // 等价 var  patt = /W3School/g
var result;

while (( result = patt.exec(str))  !=  null ) { // 这里绝不能写成 /W3School/g.exec(str),因为这相当于又new了对象,不是原来的那个RegExp了,所以就会死循环。一定要是原来的patt才行
       document.write(result);
       document.write("<br />");
       document.write(patt.lastIndex);
       document.write("<br />");
 }

执行结果:

W3School
14
W3School
24

new RegExp("\\w","gim")   ===   /\w/gim

Brief summary:

1.注意/regexp/g.exec(); 全局匹配g一定不可忘记写,且需要多次执行,因为exec执行一次只能得到一次的结果。

2.strObject.replace(/regexp/g,"xx"),在执行全局匹配时,不必像exec一样执行多次,但一定要加g,否则只能替换第一次匹配,如下示例:

let strObj = "gohome goxhome goyhome"

strObject.replace(/go(?!home)/g,"leave-"); // "gohome leave-xhome leave-yhome"

如果没有全局匹配g,如下:

strObject.replace(/go(?!home)/,"leave-"); // "gohome leave-xhome goyhome",只更改了第一个

更多基本知识 see also:     http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp

更详细实用的基础示例,包括分组匹配等:https://www.cnblogs.com/mq0036/p/6013225.html

特别喜欢魔道祖师主角魏婴的顽皮机敏、正直坚毅、义薄云天。

非常期待收获这样的友情  ^_^^_^^_^

网站文章

  • js 遍历对象

    function allPrpos(obj) { // 用来保存所有的属性名称和值 var props = &quot;&quot;; // 开始遍历 for(var p in obj){ // 方法 if(typeof(obj[p])==&quot;function&quot;){ ...

    2024-02-01 00:59:43
  • 必须要学习的源码--ConcurrentHashMap

    必须要学习的源码--ConcurrentHashMap

    开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,

    2024-02-01 00:59:38
  • 并发编程学习一

    关键信息作为笔记记录一下。1、重要模型:信号量模型,管程模型。管程是解决并发问题的万能钥匙(暂时还不是特别理解)。2、并发编程可以总结为三个核心问题:分工、同步、互斥。(并发包的设计可从这三个角度去划...

    2024-02-01 00:59:33
  • 浅谈 Integer的自动拆箱和装箱

    浅谈 Integer的自动拆箱和装箱

    public class IntegerDemo { public static void main(String[] args) { Integer i1 = 128; Integer i2 = 128; System.out.println(i1 == i2); System.out.println(i1.equals(i2)); System.out.pri...

    2024-02-01 00:59:25
  • JavaScript : 两个数的精确乘法

    JavaScript : 两个数的精确乘法

    为什么80%的码农都做不了架构师?>>> ...

    2024-02-01 00:58:55
  • btslab PHP SQL注入,btslab全攻略——注入之sql盲注1、2

    btslab PHP SQL注入,btslab全攻略——注入之sql盲注1、2

    之前做btslab的时候就想找篇完整教程来对照学习的,可是发现网上只有xss部分,并无完整攻略,所以就自己单独完成了btslab,整体感觉还是比较容易,不过对于新手还是很不错,可以学到很多漏洞知识与代...

    2024-02-01 00:58:49
  • Day05 基础5--数组、数组工具类、二维数组、冒泡排序

    Day05 基础5--数组、数组工具类、二维数组、冒泡排序

    1.数组 Arrya数组的标志[ ],作用是用于存储多个相同类型数据的集合(结构),需要连续开辟内存空间,数组定义时需要明确数组类型和长度想要获取数组中的元素值,可通过脚标(下标)来获取数组下标从0开始,下标的最大值等于数组的长度-1...

    2024-02-01 00:58:41
  • Flex 布局教程:实例篇

    Flex 布局教程:实例篇

    你会看到,不管是什么布局,Flex往往都可以几行命令搞定。 我只列出代码,详细的语法解释请查阅《Flex布局教程:语法篇》。我的主要参考资料是Landon Schropp的文章和Solved by Flexbox。 一、骰子的布局 骰子的一面,最多可以放置9个点。 下面,就来看看Flex如何实现,从1个点到9个点的布局。你可以到codepen查看Demo。 如果不加说明,本节...

    2024-02-01 00:58:13
  • 【sql server】安装程序无法与下载服务器联系。请提供 Microsoft 机器学习服务器安装文件的位置

    【sql server】安装程序无法与下载服务器联系。请提供 Microsoft 机器学习服务器安装文件的位置

    【sql server】安装程序无法与下载服务器联系。请提供 Microsoft 机器学习服务器安装文件的位置

    2024-02-01 00:58:06
  • Qt应用开发(3)——qt sqlite配置以及qt官方例程编译测试

    Qt应用开发(3)——qt sqlite配置以及qt官方例程编译测试

    平台:RK3399系统:Linux4.4+buildrootbuildroot配置qt sqlitebuildroot默认qt sqlite相关配置,sqlite是没有被配置的:编译buildroot...

    2024-02-01 00:57:59