javascript 正则表达式相关应介绍


Posted in Javascript onNovember 27, 2012

string 对象
1、str.match(RegExp)
在str中搜索匹配RegExp的字符串并保存在一个数组内返回,
如果RegExp不是全局设置(/g),仅匹配一次

("abc112dwfwabcwef2abc3wfwabcasqf453abcqwf24j234h").match(/abc\d*/g); 
//结果 
["abc112", "abc", "abc3", "abc", "abc"]

该方法中,如果正则表达式不是全局匹配模式(g标记),第一个元素将是匹配的字符串,其余是正则中捕获的字符串,并且该数组具备2个属性:
input 用于检测的字符串
index 匹配的字符串在用于检测字符串中的开始位置。
(关于这2个属性可以参考 RegExp.exec() 方法)
2、str.search(regExp)
返回符合匹配RegExp的第一个字符串的位置,如果没有匹配返回-1,全局标记没有意义,因为只匹配一次,
该方法也忽略 regExp 的 lastIndex 属性,并且总是从字符串的开始进行检索。
3、str.replace(RegExp,replaceText)
将匹配RegExp 的字符串替换为replaceText,如果 RegExp 没有全局设置,只匹配一次,使用全局模式将替换所有匹配的字符串。
如果RegExp 中使用了捕获分组匹配,则replaceText中的$具有特殊含义
$1、$2、...、$99 //与 RegExp 中的第 1 到第 99 个子表达式相匹配的文本。
$& // 与 regexp 相匹配的子串。
$` // 位于匹配子串左侧的文本。
$' // 位于匹配子串右侧的文本。
$$ // 匹配$符号自身。
注意,你需要考虑RegExp中捕获分组的数量,如果你只设置了2个捕获,那$3将不再具有特殊含义
("123ab12c11d_4532").replace(/a(b\d*)c(\d*)d/,"$1@$2-")
//将得到:
"123b12@11-_4532"
4、str.replace(RegExp,function)
str.replace 的第二个参数可以是函数,函数的返回值将作为匹配字符的替换内容,
注意,如果要全局匹配RegExp仍然需要全局g标记。
函数的参数依次是:
匹配的字符串,
配置的捕获子串(多个),
匹配字符串的开始位置,
用于匹配的原字符串
注意,请根据RegExp中捕获分组的设置数量来定义函数参数个数,如果参数太少将可能导致“匹配字符串的开始位置” 和 “用于匹配的原字符串” 不能在参数中出现,当然也可以在函数内使用arguments对象解决这个问题,arguments(arguments.length-2) 就是匹配字符串的开始位置,arguments(arguments.length-1) 就是 用于匹配的原字符串。
var newStr = ("123ab12c11d_4532").replace(/a(b\d*)c(\d*)d/g,function(s,s1,s2,pos,oldStr){ 
return "@"+s1+"@"+s2+"@"; 
}) ; 
//将得到 
"123@b12@11@_4532"

5、str.split(RegExp[,limit])
将字符串str用符合匹配的字符串分割成数组,limit 可选,用于限定返回的数组长度
("ada2afa4fcas6afa").split(/\d/,3) // "ada,afa,fcas"
6、RegExp.exec("str") 方法
在str中查找匹配的字符串,注意,每次运行该方法只匹配一次,要匹配多个需要将RegExp设置为/g,并多次运行exec()方法,每次匹配返回值 result = RegExp.exec("str")
result为一个数组,这个数组长度为1,数组元素为找到的匹配的子串,
另外,这个数组被额外赋给了2 个属性:
result.index 表示匹配的子串在原字符串的开始位置
result.input 就是原字符串
当再也无法找到符合匹配的子串时,返回 result = null,并设置 RegExp.lastIndex=0
RegExp.lastIndex 是正则表达式的属性,表示当前将从字符串的哪个位置开始匹配,初始值为0。
如果RegExp被设置为全局的,在匹配一个字符串一次之后,使用同一个RegExp对一个新的字符串进行匹配请先手动设置 RegExp.lastIndex=0
如果RegExp 不是全局匹配模式,在程序中又写了一个循环,根基返回值 result来决定是否终止匹配,从而试图匹配完这个字符串,那么,只要有符合匹配条件的子串,就必定造成死循环,因为非全局匹配只对字符串匹配一次,结果每次运行匹配操作都是匹配第一个子串,返回的 result 不为空,这是个比较容易犯的错误。
var str = "1Visit W3School, W3School is a place to study web technology."; 
var patt = new RegExp("W3School","g"); 
var result; 
document.write(patt.lastIndex+"<br />"); 
document.write("=====================================<br />"); 
while ((result = patt.exec(str)) != null) { 
document.write(patt.lastIndex+"<br />"); 
document.write(result.constructor.name+"<br />"); 
document.write(result.length+"<br />"); 
document.write(result[0]+"<br />"); 
document.write(result.index+"<br />"); 
document.write(result.input+"<br />"); 
document.write("=====================================<br />"); 
} 
document.write(patt.lastIndex+"<br />"); 
// 运行结果: 
===================================== 
Array 
W3School 
Visit W3School, W3School is a place to study web technology. 
===================================== 
Array 
W3School 
Visit W3School, W3School is a place to study web technology. 
=====================================

7、RegExp.test("str") 方法
该方法与 RegExp.exec 类似,不同的是仅返回true或false
RegExp.lastIndex 的含义是一样的(这是RegExp的属性,跟是使用test方法还是exec方法无关)
如果同一个RegExp 先后使用了test方法和exec方法,你可能需要手动设置 RegExp.lastIndex=0,这些方法是共享同一个RegExp对象的lastIndex 属性的
var str = "1Visit W3School, W3School is a place to study web technology."; 
var patt = new RegExp("W3School","g"); 
var result ; 
result = patt.test(str); 
alert(result); //true 
result = patt.test(str); 
alert(result); //true 
result = patt.test(str); 
alert(result); //false

IE9+ 、较新版本的 chrome、firefox 中 , str.match(reg) 执行完毕后,无论是否全局匹配,是否存在匹配结果 ,lastindex 被重置,reg.lastIndex = 0 , reg.test(str) 执行后,如果正则是非全局匹配的,lastindex 被重置, re.lastIndex = 0 在 IE8 及以下,正则匹配执行后除非没有匹配结果,否则 re.lastIndex 是最后一个匹配字符串的结尾字符的位置 +1,即lastIndex 没有被重置
Javascript 相关文章推荐
拥抱模块化的JavaScript
Mar 07 Javascript
jQuery UI 实现email输入提示实例
Aug 15 Javascript
jQuery对html元素取值与赋值的方法
Nov 20 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
Mar 03 Javascript
JS中prototype的用法实例分析
Mar 19 Javascript
javascript中Math.random()使用详解
Apr 15 Javascript
bootstrap按钮插件(Button)使用方法解析
Jan 13 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
Sep 11 Javascript
vuex中使用对象展开运算符的示例
Sep 25 Javascript
取消Bootstrap的dropdown-menu点击默认关闭事件方法
Aug 10 Javascript
Node.js 多进程处理CPU密集任务的实现
May 26 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
Jan 29 Javascript
javascript 二进制运算技巧解析
Nov 27 #Javascript
JavaScript prototype属性深入介绍
Nov 27 #Javascript
Knockoutjs的环境搭建教程
Nov 26 #Javascript
jquery ajax请求实例深入解析
Nov 26 #Javascript
jquery validate poshytip 自定义样式
Nov 26 #Javascript
一个可拖拽列宽表格实例演示
Nov 26 #Javascript
JS编程小常识很有用
Nov 26 #Javascript
You might like
深入PHP FTP类的详解
2013/06/13 PHP
基于PHP magic_quotes_gpc的使用方法详解
2013/06/24 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
innerHTML,outerHTML,innerTEXT三者之间的区别
2007/01/28 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
node.js中的fs.closeSync方法使用说明
2014/12/17 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
JS实现简单的图书馆享元模式实例
2015/06/30 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
2016/06/02 Javascript
js return返回多个值,通过对象的属性访问方法
2017/02/21 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
浅析Vue 生命周期
2018/06/21 Javascript
对vue中v-on绑定自定事件的实例讲解
2018/09/06 Javascript
tweenjs缓动算法的使用实例分析
2019/08/26 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
Python脚本获取操作系统版本信息
2016/12/17 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
2020/09/20 Python
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
2013/08/04 面试题
领导干部培训感言
2014/01/23 职场文书
留学自荐信写作方法
2014/01/27 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
销售人才自我评价范文
2014/09/27 职场文书
教师节主题班会方案
2015/08/17 职场文书
2016年党建工作简报
2015/11/26 职场文书
Win11软件图标固定到任务栏
2022/04/19 数码科技
详解MongoDB排序时内存大小限制与创建索引的注意事项
2022/05/06 MongoDB