js正则表达式的深入学习+分组+前瞻
来源:互联网 发布:驱赶苍蝇软件 编辑:程序博客网 时间:2024/05/22 12:04
1.首先是关于str.match(),参数是子字符串或者reg表达式;
返回包含匹配的子字符串的数组。关于多匹配与单匹配的区别参考之前博客。
(1) 'q123w34'.match('123')[0]; //'123'(2) '23d34f45g56'.match(/\d{2}/g); //['23','34','45','56']
2.重点是str.replace的深入理解
参数有两个,一个是reg或者子字符串,另一个参数replacement是替换的子字符串,reg或者函数 eg:'12345'.replace(/\d+/,'0'); //00000
replacement中的 $ 字符具有特定的含义,从模式匹配得到的字符串将用于替换。
$1、$2、...、$99 匹配与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。$& 匹配与regexp 相匹配的子串。$` 匹配位于匹配子串左侧的文本。$' 匹配位于匹配子串右侧的文本。(1)使用replacement作为reg:var a = "20141021123212";var reg4 = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/;a = a.replace(reg4,"$1-$2-$3 $4:$5:$6");//"2014-10-21 12:32:12"var s = '1233333456';s.replace(/(\d{3})(\d{4})/,"$1****");//"123****456"
(2)使用replacement作为函数替换:在本例中,我们将把字符串中所有单词的首字母都转换为大写:[1]: name = 'aaa bbb ccc';uw=name.replace(/\b\w+\b/g, function(word){ return word.substring(0,1).toUpperCase()+word.substring(1);} );[2]:// match 为匹配整个字符串,即:'abc12345#$*%'// p1 为第一个子表达式,([^\d]*),匹配0个或多个非数字的字符,即:abc// p2 为第二个子表达式,(\d*),匹配0个或多个的数字,即:12345// p3 为第三个子表达式,([^\w]*),匹配0个或匹配任何非单词字符。等价于 '[^A-Za-z0-9_]',即 #$*%// offset 为模式匹配出现的位置,从第一个字符已经匹配成功,则位置为0// string为字符串本身,即 abc12345#$*%function replacer(match, p1, p2, p3, offset, string) {return [p1, p2, p3].join(' - ');}var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer); // 替换结果为:abc - 12345 - #$*%
3.捕获性分组:(),非捕获性分组:(?:)
参考:(http://blog.csdn.net/lihefei_coder/article/details/53022253)
捕获性分组:
捕获性分组工作模式()会把每个分组里匹配的值保存起来。
比如利用捕获性分组把 hello world 互换成 world hello:
方法一:通过exec函数
var str = 'hello world'; var pattern = /([a-z]+)\s([a-z]+)/; var arr = pattern.exec(str); // exec方法返回的是一个数组,包含匹配到的字符串以及分组(也称子串)里的值console.log(arr); //['hello world','hello','world'] //这时候两个分组的值都得到了,接下来用字符串拼接法实现互换var n_str = arr[2]+' '+arr[1];console.log(n_str) //world hello
方法二:通过String的replace() ,使用$1-$9
var str = 'hello world'; var pattern = /([a-z]+)\s([a-z]+)/; var n_str = str.replace(pattern,"$2 $1");console.log(n_str) //world hello
非捕获性分组:(?:)
非捕获性分组工作模式下分组(?:)会作为匹配校验,并出现在匹配结果字符里面,但不作为子匹配返回。
比如利用非捕获性分组获取字符串000aaa111,而且只返回一个值为aaa111的数组:
//先看用捕获性分组匹配会返回什么var str1 = '000aaa111'; var pattern = /([a-z]+)(\d+)/; //捕获性分组匹配var arr = pattern.exec(str1); console.log(arr) //['aaa111','aaa','111'] 结果子串也获取到了,这并不是我们想要的结果//非捕获性分组var str2 = '000aaa111';var pattern2 = /(?:[a-z]+)(?:\d+)/; //非捕获性分组匹配var arr2 = pattern.exec(str2); console.log(arr2) //['aaa111'] 结果正确
另外,非捕获性分组不能使用$1-$9
匹配,
var str = 'hello world'; var pattern = /(?:[a-z]+)\s(?:[a-z]+)/; var n_str = str.replace(pattern,"$2 $1"); console.log(n_str)//输出: "$2 $1"
4.前瞻:(?=)和(?!)
正向前瞻(?=表达式)表示后面要有什么,反向前瞻(?!=表达式)表示后面不能有什么。前瞻分组会作为匹配校验,但不出现在匹配结果字符里面,而且不作为子匹配返回。
正向前瞻匹配一批图片格式:
//正向前瞻,匹配.jpg后缀文件名var str = '123.jpg,456.gif,abc.jpg';var partern = /\w+(?=\.jpg)/g; //正向前瞻匹配console.log(str.match(partern)); //['123', 'abc'] 返回结果正确,没有匹配456.gif.//返回匹配内容不包括前瞻匹配的内容。
反向前瞻匹配一批字母加数字:
//反向前瞻,匹配3个及以上的a,而且后面不能有000的字符var str = 'aaa000 aaaa111 aaaaaaa222';var partern = /a{3,}(?!000)/g; //反向前瞻匹配console.log(str.match(partern)); //['aaaa', 'aaaaaaa'] 返回结果正确,没有匹配aaa000
例子:
var str = '12.ty 8374.ty 090.ki'; var pattern = /\d+.(?=ty)/g; var n_str = str.match(pattern);console.log(n_str) //world hello//["12.", "8374."]
阅读全文
0 0
- js正则表达式的深入学习+分组+前瞻
- 【JavaScript 学习--01】--正则表达式的正则前瞻(?=)和非捕获性分组(?:)区别
- js正则表达式-前瞻
- JS:正则表达式学习笔记(八) - 前瞻
- javascript正则表达式分组-捕获性分组/非捕获性分组/正则前瞻
- js正则表达式的选择、分组、引用
- JavaScript正则表达式分组模式:捕获性分组与非捕获性分组及前瞻
- 正则表达式 正向前瞻
- 正则表达式 正向前瞻
- 正则表达式的分组
- JS:正则表达式学习笔记(七) - 分组
- js正则表达式深入
- 正则表达式学习记录-分组
- JS正则表达式的学习
- js正则表达式的分组和反向引用
- JS正则表达式获取分组内容的方法详解
- 正则表达式前瞻与后顾
- 正则表达式 负向前瞻
- ubuntu下如何把用户的语言环境变量改为中文
- 用conda创建python虚拟环境
- c语言运算符优先级,结合性(左/右结合详解)
- Mac下MySQL忘记登录密码
- Hdu 5699 货物运输
- js正则表达式的深入学习+分组+前瞻
- 任学堂:2300名北大学生和600个北大家庭,告诉你北大学生是怎样练成的?
- C#简单通用的进制转换,把非十进制的数据类型转换成十进制的,然后再转换成其他类型。
- Iterator和Iterable解析
- Android开发知识(七):Android事件处理机制:事件分发、传递、拦截、处理机制的原理分析(上)
- pandas groupby使用
- 洛谷P2066 机器分配
- 实验三、循环队列
- Zynq UltraScale+ MPSoC