javascript类型系统——正则表达式RegExp类型

原文:javascript类型系统——正则表达式RegExp类型

×
目录
[1]对象 [2]实例属性 [3]静态属性[4]实例方法

前面的话

  前面已经介绍过javascript中正则表达式的基础语法。javascript的RegExp类表示正则表达式,String和RegExp都定义了方法,使用正则表达式可以进行强大的模式匹配和文本检索与替换。本文将介绍正则表达式的RegExp对象,以及正则表达式涉及到的属性和方法

 

对象

  javascript中的正则表达式用RegExp对象表示,有两种写法:一种是字面量写法;另一种是构造函数写法

Perl写法

  正则表达式字面量写法,又叫Perl写法,因为javascript的正则表达式特性借鉴自Perl

  正则表达式字面量定义为包含在一对斜杠(/)之间的字符,并且可以设置3个标志

var expression = /pattern/flags;

  正则表达式的匹配模式支持下列3个标志:

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

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

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

//匹配字符串所有'at'的实例
var p = /at/g;
//test()方法返回一个布尔值表示是否可以找到匹配项
console.log(p.test('ata'));//true
console.log(p.test('aba'));//false

RegExp构造函数

  和普通的内置对象一样,RegExp正则表达式对象也支持new+RegExp()构造函数的形式

  RegExp构造函数接收两个参数:要匹配的字符串模式(pattern)和可选的标志字符串(flags),标志字符串和字面量的三个标志含义相同:'g'、'i'、'm'

  RegExp构造函数的两个参数都是字符串。且使用字面量形式定义的任何表达式都可使用构造函数

//匹配字符串所有'at'的实例
var p1 = /at/g;
//同上
var p2 = new RegExp('at','g');

  [注意]ECMAScript3规范规定,一个正则表达式直接量会在执行到它时转换为一个RegExp对象,同一段代码所表示正则表达式直接量的每次运算都返回同一个对象。ECMAScript5规范则做了相反的规定,同一段代码所表示的正则表达式直接量的每次运算都返回新对象。IE6-8一直是按照ECMAScript5规范的方式实现的,所以并没有兼容性问题

  由于正则表达式字面量并不支持变量,所以如果正则表达式中出现变量只能使用RegExp构造函数以字符串拼接的形式,将变量拼接到RegExp构造函数的参数中

  【tips】通过类名classname获取元素

function getByClass(obj,classname){var elements = obj.getElementsByTagName('*');var result = [];var pattern = new RegExp( '(^|\\s)'+ classname + '(\\s|$)');for(var i = 0; i < elements.length; i++){if(pattern.test(elements[i].className)){result.push(elements[i]);}}return result;
}

 

实例属性

  每个RegExp实例对象都包含如下5个属性

global:     布尔值,表示是否设置了g标志
ignoreCase:  布尔值,表示是否设置了i标志
lastIndex:   整数,表示开始搜索下一个匹配项的字符位置,从0算起
multiline:   布尔值,表示是否设置了标志m
source:     正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回
var pattern = new RegExp('\\[bc\\]at','i');
console.log(pattern.global);//false
console.log(pattern.ignoreCase);//true    
console.log(pattern.multiline);//false
console.log(pattern.lastIndex);//0
console.log(pattern.source);//'\[bc\]at'

  如果使用RegExp的exec()或test()函数,并且设定了全局模式'g',正则表达式的匹配就会从lastIndex的位置开始,并且在每欠匹配成功之后重新设定lastIndex。这样,就可以在字符串中重复迭代,依次寻找各个匹配结果。但是,如果需要对不同字符串调用同一个RegExp的exec()或test()方法,这个变量也也可能会带来意料之外的匹配结果,所以在更换字符串时,要显式地将RegExp的lastIndex置为0

//exec()方法以数组形式返回匹配项
var p = /\w/g;
var s = 'ab';
console.log(p.lastIndex);//0
console.log(p.exec(s));//['a']
console.log(p.lastIndex);//1
console.log(p.exec(s));//['b']
console.log(p.lastIndex);//2
console.log(p.exec(s));//null
console.log(p.lastIndex);//0
var p = /\w/g;
var s1 = 'ab';
var s2 = 'ba';
console.log(p.lastIndex);//0
console.log(p.exec(s1));//['a']
console.log(p.lastIndex);//1
console.log(p.exec(s2));//['a']
console.log(p.lastIndex);//2

 

构造函数属性

  RegExp构造函数属性被看成静态属性,这些属性基于所执行的最近一次正则表达式操作而变化

  有两种方式访问它们,即长属性名和短属性名。短属性名大都不是有效的ECMAScript标识符,所以必须通过方括号语法来访问它们

长属性名        短属性名                说明
input             $_                最近一次要匹配的字符串
lastMatch         $&                最近一次的匹配项
lastParen         $+                最近一次匹配的捕获组
leftContext       $`                input字符串中lastMatch之前的文本
multiline         $*                布尔值,表示是否所有表达式都使用多行模式
rightContext      $'                Input字符串中lastMarch之后的文本

  使用这些属性,可以从exec()方法或test()方法执行的操作中提取出更具体的信息

//test()用于测试一个字符串是否匹配某个正则表达式,并返回一个布尔值
var text = 'this has been a short summer';
var pattern = /(.)hort/g;
if(pattern.test(text)){console.log(RegExp.input);//'this has been a short summer'console.log(RegExp.leftContext);//'this has been a 'console.log(RegExp.rightContext);//' summer'console.log(RegExp.lastMatch);//'short'console.log(RegExp.lastParen);//'s'console.log(RegExp.multiline);//falseconsole.log(RegExp['$_']);//'this has been a short summer'console.log(RegExp['$`']);//'this has been a 'console.log(RegExp["$'"]);//' summer'console.log(RegExp['$&']);//'short'console.log(RegExp['$+']);//'s'console.log(RegExp['$*']);//false        
}

  javascript有9个用于存储捕获组的构造函数属性,在调用exec()或test()方法时,这些属性会被自动填充

  [注意]理论上,应该保存整个表达式匹配文本的RegExp.$0并不存在,值为undefined

//RegExp.$1\RegExp.$2\RegExp.$3……到RegExp.$9分别用于存储第一、第二……第九个匹配的捕获组
var text = 'this has been a short summer';
var pattern = /(..)or(.)/g;
if(pattern.test(text)){console.log(RegExp.$1);//shconsole.log(RegExp.$2);//t
}

 

实例方法

  RegExp对象的实例方法共5个,分为两类。包括toString()、toLocalString()、valueOf()这3种对象通用方法和test()、exec()正则匹配方法

对象通用方法

  RegExp对象继承了Object对象的通用方法toString()、toLocaleString()、valueOf()这三个方法

【toString()】

  toString()方法返回正则表达式的字面量

【toLocaleString()】

  toLocaleString()方法返回正则表达式的字面量

【valueOf()】

  valueOf()方法返回返回正则表达式对象本身

  [注意]不论正则表达式的创建方式是哪种,这三个方法都只返回其字面量形式

var pattern = new RegExp('[bc]at','gi');
console.log(pattern.toString()); // '/[bc]at/gi'
console.log(pattern.toLocaleString()); // '/[bc]at/gi'
console.log(pattern.valueOf()); // /[bc]at/givar pattern = /[bc]at/gi;
console.log(pattern.toString()); // '/[bc]at/gi'
console.log(pattern.toLocaleString()); // '[bc]at/gi'
console.log(pattern.valueOf()); // /[bc]at/gi

正则匹配方法

  正则表达式RegExp对象的正则匹配方法只有两个:分别是exec()和test()

【exec()】

  exec()方法专门为捕获组而设计,接受一个参数,即要应用模式的字符串。然后返回包含匹配项信息的数组,在没有匹配项的情况下返回null

  在匹配项数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串,如果模式中没有捕获组,则该数组只包含一项

  返回的数组包含两个额外的属性:index和input。index表示匹配项在字符串的位置,input表示应用正则表达式的字符串

var text = 'mom and dad and baby and others';
var pattern = /mom( and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
console.log(pattern,matches);
//pattern.lastIndex:20
//matches[0]:'mom and dad and baby'
//matches[1]:' and dad and baby'
//matches[2]:' and baby'
//matches.index:0
//matches.input:'mom and dad and baby and others'   

  对于exec()方法而言,即使在模式中设置了全局标志(g),它每次也只会返回一个匹配项。在不设置全局标志的情况下,在同一个字符串上多次调用exec(),将始终返回第一个匹配项的信息;而在设置全局标志的情况下,每次调用exec()都会在字符串中继续查找新匹配项

var text = 'cat,bat,sat,fat';
var pattern1 = /.at/;
var matches = pattern1.exec(text);
console.log(pattern1,matches);
//pattern1.lastIndex:0
//matches[0]:'cat'
//matches.index:0
//matches.input:'cat,bat,sat,fat'var text = 'cat,bat,sat,fat';
matches = pattern1.exec(text);    
console.log(pattern1,matches);    
//pattern1.lastIndex:0
//matches[0]:'cat'
//matches.index:0
//matches.input:'cat,bat,sat,fat'
var text = 'cat,bat,sat,fat';
var pattern2 = /.at/g;
var matches = pattern2.exec(text);
console.log(pattern2,matches);    
//pattern2.lastIndex:3
//matches[0]:'cat'
//matches.index:0
//matches.input:'cat,bat,sat,fat'var text = 'cat,bat,sat,fat';
matches = pattern2.exec(text);
console.log(pattern2,matches);    
//pattern2.lastIndex:7
//matches[0]:'bat'
//matches.index:4
//matches.input:'cat,bat,sat,fat'    

  【tips】用exec()方法找出匹配的所有位置和所有值

var string = 'j1h342jg24g234j 3g24j1';
var pattern = /\d/g;
var valueArray = [];//
var indexArray = [];//位置
var temp;
while((temp=pattern.exec(string)) != null){valueArray.push(temp[0]);indexArray.push(temp.index);  
}
//["1", "3", "4", "2", "2", "4", "2", "3", "4", "3", "2", "4", "1"] [1, 3, 4, 5, 8, 9, 11, 12, 13, 16, 18, 19, 21]
console.log(valueArray,indexArray); 

【test()】

  test()方法用来测试正则表达式能否在字符串中找到匹配文本,接收一个字符串参数,匹配时返回true,否则返回false

var text = '000-00-000';
var pattern = /\d{3}-\d{2}-\d{4}/;
if(pattern.test(text)){console.log('The pattern was matched');
}

  同样地,在调用test()方法时,会造成RegExp对象的lastIndex属性的变化。如果指定了全局模式,每次执行test()方法时,都会从字符串中的lastIndex偏移值开始尝试匹配,所以用同一个RegExp多次验证不同字符串,必须在每次调用之后,将lastIndex值置为0

var pattern = /^\d{4}-\d{2}-\d{2}$/g;
console.log(pattern.test('2016-06-23'));//true
console.log(pattern.test('2016-06-23'));//false//正确的做法应该是在验证不同字符串前,先将lastIndex重置为0
var pattern = /^\d{4}-\d{2}-\d{2}$/g;
console.log(pattern.test('2016-06-23'));//true
pattern.lastIndex = 0;
console.log(pattern.test('2016-06-23'));//true

  前面介绍过,javascript有9个用于存储捕获组的构造函数属性,在调用exec()或test()方法时,这些属性会被自动填充

  [注意]理论上,应该保存整个表达式匹配文本的RegExp.$0并不存在,值为undefined

if(/^(\d{4})-(\d{2})-(\d{2})$/.test('2016-06-23')){console.log(RegExp.$1);//'2016'console.log(RegExp.$2);//'06'console.log(RegExp.$3);//'23'console.log(RegExp.$0);//undefined
}

 

参考资料

【1】 阮一峰Javascript标准参考教程——标准库RegExp对象 http://javascript.ruanyifeng.com/stdlib/regexp.html
【2】《正则指引》第12章 JavaScript
【3】《javascript权威指南(第6版)》第10章 正则表达式的模式匹配
【4】《javascript高级程序设计(第3版)》第5章 引用类型
【5】《javascript语言精粹(修订版)》第8章 方法

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

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

相关文章

abap调用Linux命令,ABAP中输入write命令使用

1.默认输出:如果没有指定输出长度或格式,系统自动按数据类型默认值输出.eg:data i1 type i value 12345678 . write i1.数据类型I默认长度为11位,右对齐,而i1只有8位长度,所以左边以空格填充.结果: 12345678.2.指定输出.语法1: write [/p(l)] v1[o(sl)]其中:v1可以是变量…

校验值的计算----移位算法

一直以来都是从互联网获得知识&#xff0c;感觉没贡献过什么。 最近做项目研究了一个算法&#xff0c;就写一个共享出来&#xff0c;给需要的人一些参考。 说明&#xff1a; 有一个40字节的数组&#xff0c;前38个字节表示数据&#xff0c;后两个字节表示校验值。 校验值是前面…

【转】符串搜索工具及XenoCode字符串自动解密工具

【http://www.cnblogs.com/chengchen/archive/2008/07/14/1242244.html】 我们在使用OD破解软件的时候&#xff0c;字符串搜索是最常用的功能之一。但是在DONET平台下似乎没有什么比较好的软件&#xff0c;于是自己动手写了一个软件。这个软件可以自动搜索DONET程序集中的所有的…

编译Ruby2.0 问题解决

compiling readline.creadline.c: In function ‘Init_readline’:readline.c:1886:26: error: ‘Function’ undeclared (first use in this function) rl_pre_input_hook (Function *)readline_pre_input_hook; ^readline.c:1886:26: note: ea…

linux 封装python,基于linux下python学习(封装)

一、面向对象类的设计&#xff1a;在程序开发中&#xff0c;要设计一个类&#xff0c;通常需要满足以下三个要求&#xff1a;1、类名 这类事物的名字&#xff0c;满足大驼峰命名法2、属性 这类事物具有什么样的特征3、 方法 这类事物具有什么样的行为eg:小明今年18岁&#xf…

图解RAID 0, RAID 1, RAID 5, RAID 10

RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出&#xff0c;最初是为了组合小的廉价磁盘来代替大的昂贵磁盘&#xff0c;同时希望磁盘失效时不会使对数据的访问受损 失而开发出一定水平的数据保护技术。RAID就是一种由多块廉价…

程序员的不归路

程序员的不归路 数百条线程为何频繁断开&#xff0c;回调函数为何迟迟不回&#xff0c;oracle的数据为何屡遭黑手&#xff0c;连环嵌套循环案&#xff0c;究竟是何人所为&#xff1f;&#xff1f; 诡异的bug背后究竟是人是鬼&#xff0c;传来的对象次次为空的事件又影藏着什么&…

Spring JPA 中的Repository体系

为什么80%的码农都做不了架构师&#xff1f;>>> Repository体系 org.springframework.data.repository.Repository<T, ID> ---- Repository体系的顶级接口,是个空接口 interface CrudRepository<T, ID extends Serializable> extends Repository<T,…

Codeforces 258B Little Elephant and Elections

题意&#xff1a;有7个人从m个数中任选一个不重复的&#xff0c;其中4和7是幸运数&#xff0c;一个人的幸运值等于他所选的数字中所有4的个数7的个数。求一个人的幸运值比其他6人幸运值总和大的方案数。 1 #include <iostream>2 #define MOD 10000000073 using namespace…

Python 数据分析 Matplotlib篇 plot设置线条样式(第2讲)

Python 数据分析 Matplotlib篇 plot设置线条样式(第2讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

装 linux后 win7消失了,win7系统重装后ubuntu启动消失不见的解决方法

很多小伙伴都遇到过win7系统重装后ubuntu启动消失不见的困惑吧&#xff0c;一些朋友看过网上零散的win7系统重装后ubuntu启动消失不见的处理方法&#xff0c;并没有完完全全明白win7系统重装后ubuntu启动消失不见是如何解决的&#xff0c;今天小编准备了简单的解决办法&#xf…

微服务扩展新途径:Messaging

【编者按】服务编排是微服务设置的一个重要方面。本文在利用 ActiveMQ 虚拟话题来实现这一目标的同时&#xff0c;还会提供实用性指导。文章系国内 ITOM 管理平台 OneAPM 编译呈现。 目前&#xff0c;微服务使用已十分普遍&#xff0c;利用服务编排&#xff08;而不是服务编制&…

C语言发送邮件

c语言发送邮件Linux下使用c语言发送邮件 领导交代一个任务&#xff0c;需要将服务器上的df -hl的执行结果定时发给他。 尝试使用sendmail来发邮件&#xff0c;但是后来放弃了&#xff0c;并不是所有的服务器上都安装了sendmail。 于是&#xff0c;就用c写一个吧&#xff0c;还…

linux虚拟主机泛解析,Apache虚拟主机的配置和泛域名解析实现代码

Apache虚拟主机的配置和泛域名解析实现代码更新时间&#xff1a;2012年03月11日 00:28:19 作者&#xff1a;Apache虚拟主机的配置和泛域名解析实现代码&#xff0c;需要的朋友可以参考下虚拟主机的配置基于IP地址的虚拟主机配置Listen 80DocumentRoot /www/jb51ServerName ww…

GetBuffer与ReleaseBuffer的用法

GetBuffer与ReleaseBuffer的用法&#xff0c;CString剖析2008-06-07 22:39 这是一个非常容易被用错的函数&#xff0c;主要可能是由于大家对它的功能不太了解。其实点破的话&#xff0c;也不是那么深奥。 GetBuffer(int size)是用来返回一个你所指定大小可写内存的成员方法。它…

Linux 路径和目录问题

相对路径和绝对路径 绝对路径&#xff1a; 一定要从跟目录写起&#xff0c;比如/usr/share.doc 相对路径&#xff0c;不是由/写起的&#xff0c;相对指的是相对于目前的工作目录的路径。比如cd ../man&#xff0c;..指的是上一级目录 目录的相关操作&#xff1a; . 此层目录 ..…

关于js中function(e) e的理解

e是事件&#xff0c;在firefox中只能在事件现场使用window.event&#xff0c;所以只有把event传给函数使用。 为了兼容FF和其它浏览器&#xff0c;一般会在函数里重新给e赋值&#xff1a;e window.event || e;也就是说&#xff0c;如果window.event存在&#xff0c;则该浏览器…

socket用法linux,linux socket编程,要用到哪些函数,和用法介绍?_Linux_天涯问答_天涯社区...

4、获得地址信息/* 来源: http://www.jfox.info/c/a/ic/18071a.html */#include #include /* for strncpy */#include #include #include #include #include intmain(){int fd;struct ifreq ifr;fd socket(AF_INET, SOCK_DGRAM, 0);/* I want to get an IPv4 IP address */if…

深入浅出 RPC - 浅出篇+深入篇

摘自: http://blog.csdn.net/mindfloating/article/details/39473807 近几年的项目中&#xff0c;服务化和微服务化渐渐成为中大型分布式系统架构的主流方式&#xff0c;而 RPC 在其中扮演着关键的作用。在平时的日常开发中我们都在隐式或显式的使用 RPC&#xff0c;一些刚入行…

[iPhone开发]UIWebview 嵌入 UITableview

UIWebview 嵌入UITableview, 将UIWebview 加入到UITableview的cell里面&#xff0c;而且&#xff0c;将UIWebview 的高度设为内容的高度&#xff0c;内容的高度&#xff0c;可以当UIWebview 载入完成之后&#xff0c;从UIWebview 的子view中找到scrollView&#xff0c;这个scro…