正则表达式学习笔记

做项目的时候,正则表达式其实用得很少,而且大部分用得到的正则表达式都可以通过搜索引擎找到。因此这么多年来虽然已经多次研读正则表达式的文档,但偶尔要自己写的时候还是会脑子卡壳,求助谷歌…
好吧,再好好的理解一下,做个笔记,争取减少求助搜索引擎的次数。本文并非系统整理正则表达式的概念,而是加强巩固自己淡忘的一些概念和知识点。

正则表达式通过构造函数使用方法

var str = "He is a boy. She is not a boy."
var reg = new RegExp("\\bis\\b");
str.replace(reg, "IS");
//"He IS a boy. She is not a boy."
var reg = new RegExp("\\bis\\b" , 'g');
str.replace(reg, "IS");
//"He IS a boy. She IS not a boy."
 
//另一种写法:正则表达式前后用/包含,g参数加在最后
str.replace(/\bis\b/g, "IS");


* 加了“g” 参数表示整个字符串都执行,不加则只替换一次
* 文档:http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp
* “\b”是单词边界


var str = "a9b8c7d6";
str.replace(/[^abc]/g,"*");
//"a*b*c***"
 
str = "abcabcabc";
str.replace(/^a/g,"*");
//"*bcabcabc"

* “^”为反向选择符,本例中表示非abc这三个字母
* “^”放在表达式头部表示字符头,因此只替换了头部的a


var str = "abcdefg-123456";
str.replace(/[a-z-]/g,"*");
//"********123456"

* “-“在范围类”[]”中添加在最后则可以单独表示字符”-”


str="a1\na2\na3";
str.replace(/^a/g,"*");
//"*1
//a2
//a3"
str.replace(/^a/gm,"*");
//"*1
//*2
//*3"

* 参数“m”为处理多行参数。str中含有多个\n换行符,第一个表达式认为只处理总的字符开头,加了m参数则表示每一行都作为一个新的开头


str="12315678";
str.replace(/\d{3,6}/g, "*");
//"*78"
 
str.replace(/\d{3,6}?/g, "*")
//"**78"

* 上面为贪婪模式,匹配了6个字符,匹配了一次;下面为非贪婪模式,匹配最少的3个字符,匹配了两次


str="2017-08-20";
str.replace(/(\d{4})-(\d{2})-(\d{2})/g, "$3-$2-$1")
//"20-08-2017"
 
str.replace(/(?:\d{4})-(\d{2})-(\d{2})/g, "$1")
//"08"

* 分组+引用
* 分组内以“?:”开头,则分组不会被引用到


str="a1b2*3-4";
str.replace( /\w(?=\d)/g , "X");
//"X1X2*3-4"
 
str.replace( /\w(?!\d)/g , "X");
//"aXbX*X-X"

* (?=\d)判断后面紧跟着的是一个数字,但括号内本身不参与替换;(?!\d)判断后面紧跟着的不是一个数字,括号内本身不参与替换


一些支持正则表达式作为参数的字符串方法:

var str = "abc123def456";
//替换
str.replace(/\d/g,"*"); 
 
//查找并返回第一个匹配的索引,会忽略g标志
str.search(/\d/g); 
//3
 
//查找并返回所有匹配的字符串,组成数组,注意有没有g标志的区别
str.match(/\d/g);
//["1", "2", "3", "4", "5", "6"]
str.match(/\d/);
//["1"]
 
//分割字符串成数组
str.split(/\d+/g);
//["abc", "def", ""]

* match方法如果没有g标志,返回的单个值还有index属性,可以找到索引位置,参考http://www.w3school.com.cn/jsref/jsref_match.asp


在replace方法中用批处理函数:

var str = "a1b2c3d4e5";
str.replace(/\d/g , function(match , index){
	console.log(index);
	return parseInt(match)+1
});
//"a2b3c4d5e6"

* 第一个参数为匹配的值,第二个参数为索引值
* 如果正则中含有分组,则可以做更多变化,参考http://www.w3school.com.cn/jsref/jsref_replace.asp

本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.brain1981.com/1705.html。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

如本文对你有用,请在页面右侧栏扫码领取我的支付宝红包,作为打赏吧 (喂到底是我赏你还是你赏我啊-_-!)

关注我们的微信公众号-JennyStudio 本站记录了近几年的工作中遇到的一些技术问题和解决过程,“作品集”还收录了本人的大部分作品展示。除了本博客外,我们的工作室网站 – JennyStudio,内有更多作品回顾和展示。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。

发表评论

电子邮件地址不会被公开。 必填项已用*标注