JavaScript(JS)中与正则表达式有关的方法介绍

文章目录

  • RegExp
    • RegExp 对象的属性
  • compile
  • test
  • exec
  • String

在这里插入图片描述
一共有 7 个与正则表达式式相关的方法,这些方法分别来自于 RegExp 与 String 对象。

RegExp

RegExp 对象表示正则表达式, 主要用于对字符串执行模式匹配.

语法: new RegExp(pattern[, flags])

参数 pattern 是一个字符串, 指定了正则表达式字符串或其他的正则表达式对象。

参数 flags 是一个可选的字符串,包含属性 g、i 和 m,分别用于指定全局匹配、区分大小写的匹配和多行匹配。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。

var pattern = "[0-9]";
// 构造正则表达式对象
var reg = new RegExp(pattern,"g");
var reg = new RegExp("[0-9]","g");
// 也可以直接输入字面量
var reg = /[0-9]/g;

RegExp 对象的属性

包含如下属性:

实例属性描述
global是否包含全局标志(true/false)
ignoreCase是否包含区分大小写标志(true/false)
multiline是否包含多行标志(true/false)
source返回创建RegExp对象时指定的表达式文本字符串形式
lastIndex表示原字符串中匹配的字符串最后一个字符后面的位置,默认为0
flags(ES6)返回正则表达式的修饰符
sticky(ES6)是否设置了y(粘连)修饰符(true/false)

compile

compile 方法用于在执行过程中改变和重新编译正则表达式。

语法:compile(pattern[, flags])

参数介绍请参考上述 RegExp 构造器,用法如下:

var reg = new RegExp("abc", "gi");
var reg2 = reg.compile("new abc", "g");
console.log(reg); // /new abc/g
console.log(reg2); // undefined

可见 compile 方法会改变原正则表达式对象,并重新编译,而且它的返回值为空。

test

test 方法用于检测一个字符串是否匹配某个正则规则,只要是字符串中含有与正则规则匹配的文本,该方法就返回 true,否则返回 false。

语法:test(string)

用法如下:

console.log(/[0-9]+/.test("abc123")); // true
console.log(/[0-9]+/.test("abc")); // false

以上,字符串”abc123” 包含数字,故 test 方法返回 true;而字符串”abc” 不包含数字,故返回 false。

实际上,如果正则表达式带有全局标志(带有参数 g)时,test 方法还受正则对象的 lastIndex 属性影响,如下:

var reg = /[a-z]+/; // 正则不带全局标志
console.log(reg.test("abc")); // true
console.log(reg.test("de")); // true
var reg = /[a-z]+/g; // 正则带有全局标志g
console.log(reg.test("abc")); // true,成功匹配到字符串 abc
console.log(reg.lastIndex); // 3, 最近 1 次匹配到的字符串最后 1 个字符后面的位置。下次运行 test 时,正则引擎将从索引为 3 的位置开始查找
console.log(reg.test("de")); // false,reg 对象的属性 lastIndex 的值为 3,所以只会从位置 3 开始尝试匹配,而字符串“de”根本就没有位置 3,所以直接匹配失败

exec

语法:exec(string)

exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法以及支持正则表达式的 String 对象的方法更为复杂。

如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。

但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。

var reg = /([a-z]+)/gi,string = "World Internet Conference";
var array = reg.exec(string);
console.log(array); // ["World", "World", index: 0, input: "World Internet Conference"]
console.log(RegExp.$1); // World
console.log(reg.lastIndex); // 5, 刚好等于 array.index + array[0].length

如上代码,可以看到 reg.lastIndex == array.index(匹配开始的位置)+ array[0].length(匹配字符串的长度)。

随着检索继续, array.index 的值会变成下个匹配字符串的开始位置, 相应地 reg.lastIndex 的值会变成下个匹配字符串的结束位置。我们也可以通过反复调用 exec 方法来遍历源字符串中所有的匹配字符串,直到 exec 方法再也匹配不到文本时,它将返回 null,并把 reg.lastIndex 属性重置为 0。

array = reg.exec(string);
console.log(array);//["Internet", "Internet", index: 6, input: "World Internet Conference"]
console.log(reg.lastIndex);//14array = reg.exec(string);
console.log(array);//["Conference", "Conference", index: 15, input: "World Internet Conference"]
console.log(reg.lastIndex);//25array = reg.exec(string);
console.log(array);//null
console.log(reg.lastIndex);//0

有的时候我们需要手动将 lastIndex 的值手动设置为 0,如下例子:

var reg = /[0-9]+/g,str1 = "123abc",str2 = "123456";
reg.exec(str1);
console.log(reg.lastIndex);//3
var array = reg.exec(str2);
console.log(array);//["456", index: 3, input: "123456"]

以上代码,正则式在匹配字符串 str2 时,期望的正确结果应该是“123456”,因此建议在第二次执行 exec 方法前,增加一句 reg.lastIndex = 0;。

String

match,search,replace,split 方法请参考字符串API。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/333725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Requests库实战(四)---爬取肯德基餐厅地址信息

功能:爬取查询后的肯德基餐厅的地址信息 地址:http://www.kfc.com.cn/kfccda/storelist/index.aspx 亮点是post请求的参数有两组:查询字符串参数,表单数据。 对于post请求,由于url中隐藏了许多参数,所以引入了表单数据…

显示请求_学习记录:HTTP的响应与请求amp;Curl

本文包含四个部分,简要介绍HTTP请求、HTTP响应、chrome开发者查看、与CURL命令。Part1:HTTP请求1GET请求指定的页面信息,并返回实体主体。2HEAD类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头。3POST向…

java.线程池 线程数_如何在线程“ main”中修复异常java.lang.NoClassDefFoundError:Java中的org / slf4j / LoggerFactory...

java.线程池 线程数此错误表示您的代码或您在应用程序中使用的任何外部库都在使用SLF4J库 (一个开放源代码日志记录库),但无法找到所需的JAR文件,例如slf4j-api-1.7.2.jar因此它是在线程“ main” java.lang.NoClassDefFoundError…

正则表达式实战---爬取多张图片

主要是分析网站图片的html源代码,来决定正则表达式如何写。 完整代码 #使用正则表达式爬取多张图片,亮点在于数据解析 #爬取网站:https://www.bilibili.com/read/cv11323037?fromsearch import requests import re import os image_pathimage if not …

JS(JavaScript) 使用捕获性分组处理文本模板,最终生成完整字符串

var tmp "An ${a} a ${b} keeps the ${c} away";// obj 是 json 对象 var obj {a:"apple",b:"day",c:"doctor" };/** *descript 声明定义一个函数 tmpl,该函数将文本模板对应的变量替换后返回 * */function tmpl(t,o){/*…

6 日期字符串转日期_Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类...

因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API。Stephen向JCP提交了一个规范,他本人作为规范的领导人,该规范就是JSR 310&am…

第一个JDK 10(18.3)候选版本(内部版本43)展示了新的版本控制方案

Mark Reinhold的帖子“ JDK 10:First Release Candidate ”宣布“在build 43中没有未解决的P1错误”,并将Build 43命名为最初的JDK 10 Release Candidate 。 Reinhold帖子还指向“ JDK 10 Early Access Builds ”页面,该页面包含发行说明的链…

安装Pytorch如何选择CUDA的版本

安装Pytorch时CUDA的选择Nvidia CUDA查看CUDA版本方法查看CUDA的驱动API版本查看CUDA的运行API版本查看官方CUDA的运行API版本方法1方法2查看Anaconda里cudatoolkit包版本CUDA是一个并行计算平台和编程模型,能够使得使用GPU进行通用计算变得简单和优雅。Nvidia官方提…

MySQL的通配符

% 表示匹配任意数量(包含 0 个)的任意字符,跟 like 配合使用_ 下划线表示匹配任意 1 字符

db2 springboot 整合_[SpringBoot]快速配置多数据源(整合MyBatis)

前言由于业务需求,需要同时在SpringBoot中配置两套数据源(连接两个数据库),要求能做到service层在调用各数据库表的mapper时能够自动切换数据源,也就是mapper自动访问正确的数据库。本文内容:在SpringbootMybatis项目的基础上&…

pytorch使用GPU炼丹笔记

如何使用GPU训练/测试模型使用单GPU设置设备将数据转换成CUDA张量将模型参数转换成CUDA张量使用指定GPU1.使用CUDA_VISIBLE_DEVICES。1.1 直接在终端或shell脚本中设定:1.2 python代码中设定:2. 使用函数 set_device使用多GPUDP方法DDP方法需要先初始化数…

java解决错误经验_在Java错误进入生产之前的新处理方式

java解决错误经验我们如何认识到解决预生产错误的旧方法还不够,以及我们如何能够改变它 第一次尝试就没有完美的代码,我们所有人都可以证明我们已经通过艰苦的努力学习了。 不管我们使用多少测试周期,代码审查或工具,总有至少一个…

vim 寄存器中的 ^@,^M,^J

首先,ASCII 码表示的字符不都是可打印字符(可显示字符),意味着,其中的控制字符本不是对应某个字形的,所以本没有办法看到他们。那么如果万一某个文件中出现了这些怎么办捏??这里我们…

2019怎么保存低版本_CAD发给客户没字体怎么办?快速打包外部参照、字体、打印样式...

CAD发给客户没字体怎么办?快速打包DWG外部参照、字体、图片、打印样式!有没有遇见过这样的情况:图纸发给客户,外部参照的文件没有一起打包发出去,被老板和客户臭骂一顿。图纸发给审图,没有字体,…

Python正则表达式笔记

正则表达式作用函数函数参数查找函数re.findall()re.search()re.match()re.finditer()re.compile()函数替换函数re.sub(pattern,repl,string,count0,flags0)re.subn()分割函数re.split()模式串字符字符类别表达(匹配单个字符)\d\D\s\S\w\W[a-z][^a-z].多次匹配字符*&#xff1f…

CentOS Linux 下的 vim 无法使用系统剪贴板,怎么解决呢?

文章目录查看系统当前的 vim 是否支持剪贴板安装 gvim 来支持系统剪贴板gvim 和 vim 的区别SSH 连接远程主机遇到的问题查看系统当前的 vim 是否支持剪贴板 首先查看下系统的 vim 是否支持系统剪贴板,在命令终端输入如下命令: [roothtlwk0001host test…

jwt令牌_jwt-cli:用于解码JSON Web令牌(JWT令牌)的Shell库

jwt令牌当我开始经常需要解码JSON Web令牌时,我感到迫切需要编写允许我快速进行操作的程序。 有很多不错的选项,例如jwt.io ,但是一旦您需要执行此操作,它通常就会变得笨拙。 并且,如果您需要处理多个令牌或进一步处理…

日历对象导哪个包_java.util的的Date类和Calendar类

Datejava.util.Date类的对象用来表示时间和日期,用得最多的是获取系统当前日期和时间,精确到毫秒。Java中有两个Date类,还有一个是java.sql.Date,这个类一般不用,即使在数据库中也不推荐使用。写代码时注意导入的包一定…

Debian Linux 的 vim 如何使用系统剪贴板

以 ubuntu 为例,ubuntu 默认是没有 vim 的,需要自己安装一下: 更新源: apt-get update安装 vim : apt-get install vim此时,系统不支持剪切板,我们使用命令 vim --version|grep clipboard 查…

Python中replace()函数

replace()函数 功能:类似正则表达式的sub()函数,使用新的字符串替换主串中的内容。 函数需要通过字符串来调用,replace(old, new, max)函数参数依次为: old表示主串中要被替换的字符串。new表示新的字符串。max表示替换次数,默…