学JS的心路历程-正规表达式Regular Expression
今天我们来看正规表达式,在谈到为什么需要多学这个之前,先来看个示例。
假设需要判断输入字串是否含有“apple”:
var text=“A apple a day keeps the doctor away”;
function hasApple(val){
hasStr = val.indexOf(“apple”);
if(hasStr === -1)return false;
return true;
}
hasApple(text);//true
看起来很简单,对吧!但如果今天要判断的不只一个的话呢?
只能不段增加变数和判断式长度吗?这听起来就是个写“糙code”的开始。
(想知道什么是“糙code”可以参考这个系列喔可不可以不要写糙code)
那么该怎么作呢?很简单,JS有提供给我们正规表达式,可以这样写:
var text=“A apple a day keeps the doctor away”;
function hasApple(val){
return /apple/.test(text)
}
hasApple(text);//true
是不是比上面的例子干净许多了呢!
既然这样,话不多说我们赶紧来看到底怎么用吧。
在JS中我们有两种方式可以建立正规表达式:
透过正规表达式实值
建立一个RegExp实例
const pattern = /apple/;
const otherPattern = new RegExp(“test”);
两种方式都能建立出相同的正规表达式,但如果在一开始就知道了正规表达式的内容,会一般会比较推荐用实值的方式建立,建构式方式比较用于程序执行阶段时,动态透过字串建立。
接下来会列出常见的语法以及与之相关的方法,可能会让你认为难以理解,但我会尽我所能的用示例讲解。
首先我们要知道正规表达式都会包含两个/,千万不要跟\搞混,他是有特殊用法的(hzbutik)!
一般字元:
语法说明
/apple/含有apple的字串
/./含有任意字元的字串
/apple./含有apple后面接任意字元的字串
示例:
var text =“A apple a day keeps the doctor away.I have pen,I have apple.Uh!ApplePen!!“;
/apple/.test(text);//true
text.match(/./);//[“A”,index: 0,input:“A apple a day keeps the doctor away.I have pen,I have apple.Uh!ApplePen!!“,groups: undefined]
text.replace(/./,“hi”)
//“hi apple a day keeps the doctor away.I have pen,I have apple.Uh!ApplePen!!“
这边我们可以看到
test是回传字串内“是否”含有正规表达式指定的字元。
match会根据正规表达式回传符合字串的数组。
replace会根据正规表达式取代符合字串。
旗标值
语法说明
/apple/i不区分英文大小写
/apple/g全局匹配,只要符合就会回传
m多行匹配
y进行黏性匹配(sticky matching),只会对最后一次符合处之后进行匹配,需要配合设定lastIndex
u对unicode数值作跳脱
示例:
var text =“A apple a day keeps the doctor away.I have pen,I have apple.Uh!ApplePen!!“;
/apple/.test(text);//true
text.match(/apple/g);//[“apple”,“apple”]
text.match(/apple/ig);//[“apple”,“apple”,“Apple”]
text.replace(/apple/ig,“hi”);//“A hi a day keeps the doctor away.I have pen,I have hi.Uh!hiPen!!“
y这边我特别拉出来说明,因为看了官网文件还是不太懂,搜寻很久才得到解答:
var str =“I have apple”;
//0123456789
var regx = /apple/y;
regx.lastIndex = 7;
regx.test(str);//true
regx.test(str);//false
y会根据你设置的lastIndex位置开始匹配,不匹配则回传否,不会在往下寻找,
且lastIndex重制为0。
通常使用于避免前缀字串影响正规表达式时。
符号
语法说明
^字串开头必须符合条件字元
$字串结尾必须符合条件字元
*字元可以出现0次以上
?字元可以出现1次或0次
+字元至少出现1次
{}指定字元重复出现次数
{1,}指定字元重复出现1次以上
{,3}指定字元重复出现3次以下
/^test/.test(“est test”);//false
/test$/.test(“est test”);//true
/t+est/.test(“est”);//false
/t?est/.test(“est”);//true
/t*est/.test(“ttttest”);//true
/t{,3}est/.test(“ttttest”);//false
比对多个字元
语法说明
[]字串若含有[xxx]里面字元则匹配
[^]字串若不含有[^xxx]里面字元则匹配
[0-9]字串若含有数字0到9字元则匹配
[a-z]字串若含有a到z字元则匹配
/^[a-z]/.test(“est test”);//true
/[0-9]$/.test(“est test”);//false
/^[^a-z]/.test(“est test”);//false
/[0-9]/.test(“1est test”);//true
特殊字元
我们前面有提到过\会有特殊用途,这边就是啰!
语法说明
d任何数字字元,等于[0-9]
D任何非数字字元,等于[^0-9]
w任何数字字元字母底线,等于[A-Za-z0-9_]
W任何非数字字元字母底线,等于[^A-Za-z0-9_]
s
S
//检查公元格式
/^\d{4}-\d{2}-\d{2}$/.test(“1992-12-22”);//true
以上就是常见的正规别达式语法,老实说自己也很少用到这么多,多半是想到时候才去查一下用法(drivingLessonscork)。
这边跟各位分享一个横线区个的字串转为驼峰式的程序:
var text =“has-a-text”;
function upper(match,p1){
return p1.toUpperCase()
}
text = text.replace(/-(\w)/g,upper);//“hasAText”
学JS的心路历程-正规表达式Regular Expression的更多相关文章
- 学JS的心路历程-函式(二)arguments
参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...
- 学JS的心路历程-函式(五)箭头函式
箭头函式arrow function 为了能够以更简短的方式建立函式,ES6变推出了箭头函式. 用说明的可能会不太懂,我们先拿之前的数组排序例子来看: var arr = [2,1,6,12,3,77 ...
- 学JS的心路历程Day26 - PixiJS -入坑
后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...
- 学JS的心路历程 -函式(三)this
this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...
- 学JS的心路历程 - JS应用
各家电商网站都推出了各种活动和现今优惠券,当时在逛PTT时看到了有篇文章,提供代码教大家用JS的方式抢票,看了一下后发现好像很多人好奇这是怎么做的,于是就想说想一篇文章来讲解一下. 我们先来看一下折价 ...
- 学JS的心路历程 - JS的Class
没错,你没有看错,虽然前面说JS是原型继承,但在ES6以后新增了class关键字!!! 不过底层实作仍然是以原型继承方式进行,所以基本上算是一个语法糖. 今天我们就来看一下如何使用吧! class 首 ...
- 学JS的心路历程-物件与原型(三)
昨天有说明到函式与建构式的原型,及指定建构式函式原型为另一个建构式函式,但其实这会造成复写constructor的问题. 复写constructor的问题(vmwork) 我们昨天有提到「建构式函式可 ...
- 学JS的心路历程 -物件与原型(二)
昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...
- 学JS的心路历程-物件与原型(一)
前两天说明面向对象的三大特性及JS不符合面向对象,只能称作支持面向对象而已,今天我们来看看JS的原型继承. 首先我们先来看,什么是原型(vmwork): 两个物件之间的原型关系(prototype r ...
随机推荐
- C语言:传值,传地址
形参:形式参数实参:实际参数 传值: 把实参的值复制给形参, 修改函数内的形参,不会影响实参. 传地址: 指针传值,形参为指向实参地址的指针 当对形参的指向操作时,相当于对实参本身进行的操作 #inc ...
- SHOI2016方
/* 上帝说 要方 是的 很方 计数问题的容斥思想 (首先要注意 正方形有斜着的QAQ) 考虑我们要求的合法正方形 ans 根据容斥 ans = 无限制方案书 - 一个点确定的方案数 + 两个点确定的 ...
- 避免crontab输出日志
在cron的自动执行语句后加上> /dev/null 2>&1 例:4 3 * * * /usr/bin/a.sh > /dev/null 2>&1这样就OK拉 ...
- JVM总结-虚拟机加载类
从 class 文件到内存中的类,按先后顺序需要经过加载.链接以及初始化三大步骤.其中,链接过程中同样需要验证:而内存中的类没有经过初始化,同样不能使用.那么,是否所有的 Java 类都需要经过这几步 ...
- mke2fs
mke2fs - create an ext2/ext3/ext4 filesystem # mke2fs -b -c -N -t ext4 /dev/sdb #(注意末尾是/dev/sdb....? ...
- <项目管理的决策力>总结梳理
最近去总部参加了两天培训,关于<项目管理的决策力>,有时间会整理一下思路. ---todo 总结 6个阶段30个决策点如下:
- scp(secure copy)安全拷贝
scp(secure copy)安全拷贝 (1)scp定义: scp可以实现服务器与服务器之间的数据拷贝.(from server1 to server2) (2)基本语法 命令 递归 要拷贝的文 ...
- SVG:中国地图
中国地图 <svg height="578" version="1.1" width="718" xmlns="http:/ ...
- ChannelSftp 远程下载目录
ChannelSftp 并不直接支持远程下载目录, 直接下载, 出现 : not supported to get directory ... 需要自己实现, 我的实现如下: /** * @param ...
- <转载>apache 配置 http://www.blogjava.net/bukebushuo/articles/229103.html
基于 NCSA 服务器的配置文件 由 Rob McCool 编写,龙子翻译 Apache服务器主配置文件. 包括服务器指令的目录设置. 详见 <URL:http://www.apache.org ...