ECMA RegExp类型

2023-12-03 19:48
文章标签 类型 regexp ecma

本文主要是介绍ECMA RegExp类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、RegExp类型格式:创建正则表达式可以有两种形式:一种是字面量的形式,另一种是用RegExp构造函数

字面量模式:

var expression=/pattern/flags;(pattern部分是正则表达式。每个正则可以带有一个或多个标志flags,用以标明正则表达式的行为。正则表达式的匹配模式支持下列3个标志。)

     g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;

     i:表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写;

     m:表示多行(multiline )模式。即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。

RegExp构造函数创建:var a=new RegExp("正则表达式","匹配模式");

由于RegExp构造函数的两个参数都是字符串,所以在某些情况下需要对字符进行双重转义。所有元字符都必须双重转义。已经转移过的字符也是如此。如:\n(字符\在字符串中通常被转义为\\,而在RegExp构造函数字符串中就变成\\\\):

字面量模式等价的RegExp模式的字符串
/\[bc\]at/ "\\[bc\\]at"
 /\.at/  "\\.at"
 /^\d/  (以数字开头)  "^\\d"

2、RegExp实例属性:RegExp的每个实例都有下列属性,通过这些属性可以取得有关模式的各种信息。

global:布尔值,表示是否设置了g标志。

ignoreCase:布尔值,表示是否设置了i标志。

lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起。

multiline:布尔值,表示是否设置了m标志。

source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。 通过这些属性可以获知一个正则表达式的各方面信息,但却没有多大用处,因为这些信息全都包含在模式声明中。例如:

var pattern1=/\[bc\]at/i;
alert(pattern1.global);//false
alert(pattern1.ignoreCase);//true
alert(pattern1.multiline);//false
alert(pattern1.laseIndex);//0
alert(pattern1.source);//"\[bc\]at"var pattern2=new RegExp("\\[bc\\]at","i");
alert(pattern2.source);//"\[bc\]at"  source属性保存的是规范形式的字符串,即字面量形式所用的字符串。

3、元字符

1)、+: 最少出现一次,最多不限,相当于量词里的{1,},例:

var i=/\d/g;
var j="12d dsf21 5";
console.log(j.match(i)); //1,2,2,1,5

如果用了+(加号)那么:

var i=/\d+/g;
var j="12d dsf21 5";
console.log(j.match(i)); //12,21,5

2)、|(或):例 :

var i=/a|b|c/g;
var j="hiuahbjc";
alert(j.replace(i,'0'));//hiu0h0j0

3)、[ ](其中任意字符):比如[abc]c //ac或bc或cc都匹配

4)、[a-z0-9](范围):a到z和0到9之间的都行

5)、[^a](排除):例:[^0-9a-z]//除了英文和数字

6)、^(出现在方括号外面表示行首)

7)、$(出现在方括号外面表示行尾)

8)、. (点):表示任意字符

9)、?(问号):表示可以有可以没有,最多出现1次,相当于{0,1}

例:电话前面可以有区号,也可以没有区号,比如021-85355165-32133,区号以0开头

(0\d{2,3}-)?[1-9]\d{7}(-\d{1,5})?

10)、* (星号):表示任意次,相当于{0,} ,例:

var i=/\d*/g;
var j="12d dsf21 5";
console.log(j.match(i)); //["12", "", "", "", "", "", "21", "", "5", ""]字母和空格出现0个数字所以也匹配  

11)、 \d:表示数字相当于[0-9]

12)、\D:表示除了数字相当于[^0-9]

13)、\w:表示英文、数字、下划线 相当于[a-z0-9_]

14)、\W:表示除了英文、数字、下划线以外的字符 相当于[^a-z0-9_]

15)、\s:表示空白字符(空格、Table等)

16)、\S:表示除了空白字符 

例:关于.*?     表示取前面任意长度的字符,到底一个>出现

var i="<p color="red">fffffffff</p><p>fffffffff</p>11111 ";
i.match(/<p.*?>/ig);//<p color="red">,<p>

4、量词:

1)、{n}:正好出现n次

例:电话号码第一位必须是1-9,总数为8位

[1-9]\d{7}

2)、{n,m}:最少n次,最多m次

例:QQ号现在一般5到11位,第一位不为0

[1-9]\d{4,10}

3)、{2,}:最少2次,最多不限

 5、match():返回匹配的项,此为字符串对象方法,参数为要检索的字符串值或者要匹配的正则表达式。

例一:

var str="Hello world!"
document.write(str.match("world") + "<br />")//world
document.write(str.match("World") + "<br />")//null

例二:

var str="1 plus 2 equal 3"
document.write(str.match(/\d+/g))//1,2,3

6、replace():替换字符串中的字符。此为字符串对象方法,返回值为替换后的新的字符串。有两个参数,第一个参数可以是字符串或者正则表达式,第二个参数为替换的文本或生成替换文本的函数。第二个参数中的$字符有特定的含义。

字符替换文本
$1、$2、$3、……、$99与 regExp 中的第 1 到第 99 个子表达式相匹配的文本。
$&与regExp相匹配的子串
$`位于匹配子串左侧的文本
$'位于匹配子串右侧的文本
$$直接量符号
例子 1:
在本例中,我们将把 "Doe, John" 转换为 "John Doe" 的形式:

name = "Doe, John";
name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");//Doe, John 

例子 2:
在本例中,我们将把所有的花引号替换为直引号:

name = '"a", "b"';
name.replace(/"([^"]*)"/g, "'$1'");//"a", "b" 

例3:

var str='adsf aaa ewr';
alert(str.replace('a','0'));//'0dsf aaa ewr'只替换了第一个字母a

所以此方法一般要配合正则使用 如:

var str='adsf aaa ewr';
alert(str.replace(/a/g,'0'));//'0dsf 000 ewr'

7、search():此为字符串对象方法,功能:查找,用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。此方法和indexOf()方法的区别是它还能检索正则表达式。例:

          var i="abc";console.log(i.search("b"));//返回1
还可以检索正则 例:
          var i="abcdefg";console.log(i.search(/ef/));//返回4 

8、test()方法:此为正则对象方法,用于检测一个字符串是否匹配某个正则。参数为检测的字符串。如果参数中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 false。例:

var str = "Visit W3School";
var patt1 = new RegExp("W3School");
var result = patt1.test(str);
document.write("Result: " + result);//true

9、exec():此为正则对象方法,专门为捕获组设计的。正则字面量中第一个(里的内容表示第一个捕获组,第二个(表示第二个捕获组,依次类推。接收一个参数,即要应用正则的字符串,返回值为返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。另外返回的数组包含两个额外的属性:index和input。其中index表示匹配项在字符串中的位置,而input表示应用正则表达式的字符串。在数组中,第0项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串(如果模式中没有捕获组,则该数组只包含一项)。例:

var text="mom and dad and baby";
var pattern=/mom( and dad( and baby)?)?/gi;
var matches=pattern.exec(text);
alert(matches.index);//0
alert(matches.input);//"mom and dad and baby"  还可以用RegExp.input来得到相同结果
alert(matches[0]);//"mom and dad and baby"
alert(matches[1]);//" and dad and baby"
alert(matches[2]);//" and baby"
    对于exec()方法而言,即使在模式中设置了全局标志(g),它每次也只会返回一个匹配项。在不设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项的信息。而在设置全局标志的情况下,每次调用exec()则都会在字符串中继续查找新匹配项,如下面的例子所示。

var text="cat, bat, sat, fat";
var pattern1=/.at/;
var matches=pattern1.exec(text);
alert(matches.index);//0
alert(matches[0]);//cat
alert(pattern1.lastIndex);//0matches=pattern1.exec(text);
alert(matches.index);//0
alert(matches[0]);//cat
alert(pattern1.lastIndex);//0var pattern2=/.at/g;
var matches=pattern2.exec(text);
alert(matches.index);//0
alert(matches[0]);//cat
alert(pattern2.lastIndex);//0matches=pattern2.exec(text);
alert(matches.index);//5
alert(matches[0]);//bat
alert(pattern2.lastIndex);//8
上面的lastIndex为正则对象的属性。表示上一次匹配文本之后的第一个字符的位置。要注意的是:IE的javascript实现在此属性上存在偏差,即使在非全局模式下此属性每次也会变化。

10、RegExp实例继承的toLocaleString()、toString()方法都会返回正则表达式的字面量,与创建正则表达式的方式无关。而valueOf()方法返回正则表达式本身,例:

var pattern=new RegExp("\\[bc\\]at","gi");
alert(pattern.toString());//  /\[bc\]at/gi 输出的为字符串类型
alert(pattern.toLocaleString()); //   /\[bc\]at/gi 输出的为字符串类型
alert(pattern.valueOf());//  /\[bc\]at/gi 输出的是正则表达式本身(对象类型)
11、RegExp构造函数属性:RegExp构造函数包含一些属性(这些属性在其他语一言中被看成是静态属性)。这些属性适用于作用域中的所有正则表达式,并且基于所执行的最近一次正则表达式操作而变化。关于这些属性的另一个独特之处,就是可以通过两种方式访问它们。换句话说,这些属性分别有一个长属性名和一个短属性名〔Opera是例外,它不支持短属性名)。下表列出了RegExp构造函数的属性。

长属性名短属性名
input$_  表示最后一次要匹配的字符串
lastMatch$& 表示最近一次的匹配项
lastParen$+ 表示最近一次匹配的捕获组
leftContent$`  表示input字符串中lastMatch之前的文本
rightContent$'  表示input字符串中lastMatch之后的文本
multine$* 布尔值,表示是否所有表达式都使用多行模式
捕获组1~9,正则字面量中
第一个(里的内容表示第一个捕获组,
第二个(表示第二个捕获组,依次类推,最多9个
$1至$9

var text="this has been a short summer";
var pattern=/(.hort)/g;
if(pattern.test(text)){
alert(RegExp.input);//this has been a short summer
alert(RegExp.leftContext);//this has been a
alert(RegExp.rightContext);//summer
alert(RegExp.lastMatch);//short
alert(RegExp.lastParen);//s
alert(RegExp.multiline);//false
}
    如前所述,例子使用的长属性名都可以用相应的短属性名来代替。只不过,由于这些短属性名大都不是有效的ECMAScript标识符,因此必须通过方括号语法来访问它们。如下所示。

var text="this has been a short summer";
var pattern=/(.hort)/g;
if(pattern.test(text)){
alert(RegExp.$_);//this has been a short summer
alert(RegExp["$`"]);//this has been a
alert(RegExp["$'"]);//summer
alert(RegExp["$&"]);//short
alert(RegExp["$+"]);//s
alert(RegExp["$*"]);//false
}
捕获组$1~$9,在调用exec()或test()方法时,这些属性会被自动填充。然后我们就可以像下面那样使用它们。

var text="this has been a short summer";
var pattern=/(..)or(.)/g;
if(pattern.test(text)){
alert(RegExp.$1);//sh
alert(RegExp.$2);//t
}

即使test()方法只返回一个布尔值,但RegExp构造函数的属性$1和$2也会被匹配相应捕获组的字符串自动填充。

11、正则匹配unicode中的中文:\u4e00-\u9fa5,表示中文字编码的第一个到最后一个


这篇关于ECMA RegExp类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/450668

相关文章

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

C#之枚举类型与随机数详解

《C#之枚举类型与随机数详解》文章讲解了枚举类型的定义与使用方法,包括在main外部声明枚举,用于表示游戏状态和周几状态,枚举值默认从0开始递增,也可手动设置初始值以生成随机数... 目录枚举类型1.定义枚举类型(main外)2.使用生成随机数总结枚举类型1.定义枚举类型(main外)enum 类型名字

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

MySQL 索引简介及常见的索引类型有哪些

《MySQL索引简介及常见的索引类型有哪些》MySQL索引是加速数据检索的特殊结构,用于存储列值与位置信息,常见的索引类型包括:主键索引、唯一索引、普通索引、复合索引、全文索引和空间索引等,本文介绍... 目录什么是 mysql 的索引?常见的索引类型有哪些?总结性回答详细解释1. MySQL 索引的概念2

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

SpringBoot改造MCP服务器的详细说明(StreamableHTTP 类型)

《SpringBoot改造MCP服务器的详细说明(StreamableHTTP类型)》本文介绍了SpringBoot如何实现MCPStreamableHTTP服务器,并且使用CherryStudio... 目录SpringBoot改造MCP服务器(StreamableHTTP)1 项目说明2 使用说明2.1