今天我们来看正规表达式,在谈到为什么需要多学这个之前,先来看个示例。

假设需要判断输入字串是否含有“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的更多相关文章

  1. 学JS的心路历程-函式(二)arguments

    参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...

  2. 学JS的心路历程-函式(五)箭头函式

    箭头函式arrow function 为了能够以更简短的方式建立函式,ES6变推出了箭头函式. 用说明的可能会不太懂,我们先拿之前的数组排序例子来看: var arr = [2,1,6,12,3,77 ...

  3. 学JS的心路历程Day26 - PixiJS -入坑

    后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...

  4. 学JS的心路历程 -函式(三)this

    this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...

  5. 学JS的心路历程 - JS应用

    各家电商网站都推出了各种活动和现今优惠券,当时在逛PTT时看到了有篇文章,提供代码教大家用JS的方式抢票,看了一下后发现好像很多人好奇这是怎么做的,于是就想说想一篇文章来讲解一下. 我们先来看一下折价 ...

  6. 学JS的心路历程 - JS的Class

    没错,你没有看错,虽然前面说JS是原型继承,但在ES6以后新增了class关键字!!! 不过底层实作仍然是以原型继承方式进行,所以基本上算是一个语法糖. 今天我们就来看一下如何使用吧! class 首 ...

  7. 学JS的心路历程-物件与原型(三)

    昨天有说明到函式与建构式的原型,及指定建构式函式原型为另一个建构式函式,但其实这会造成复写constructor的问题. 复写constructor的问题(vmwork) 我们昨天有提到「建构式函式可 ...

  8. 学JS的心路历程 -物件与原型(二)

    昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...

  9. 学JS的心路历程-物件与原型(一)

    前两天说明面向对象的三大特性及JS不符合面向对象,只能称作支持面向对象而已,今天我们来看看JS的原型继承. 首先我们先来看,什么是原型(vmwork): 两个物件之间的原型关系(prototype r ...

随机推荐

  1. [AH2017/HNOI2017]大佬(动态规划 搜索)

    /* 神仙yyb 理解题意可以发现 能够对大佬造成的伤害只和你怼了多少天大佬有关, 而且显然天数越多越好 那么我们可以先通过预处理来找出我们最多能够怼多少天大佬 然后我们发现最后我们能怼的血量状态数是 ...

  2. python return 返回多个值

    python return 返回多个值,实际返回的是一个tuple: #!/usr/bin/env python # -*- coding: utf-8 -*- def rt(): return 1, ...

  3. flask session,蓝图,装饰器,路由和对象配置

    1.Flask 中的路由   *endpoint - url_for 反向地址  *endpoint 默认是视图函数名  *methods 指定视图函数的请求方式,默认GET  defaults={& ...

  4. SQLServer树查询

    感觉这个CTE递归查询蛮好用的,先举个例子: use City; go create table Tree ( ID int identity(1,1) primary key not null, N ...

  5. 如何安装 Microsoft Office 兼容包,以便您可以在早期版本的 Microsoft Office 中打开和保存 Office Open XML 格式

    https://support.microsoft.com/zh-cn/kb/923505 针对 Office 2003 的支持已终止 Microsoft 已于 2014 年 4 月 8 日终止了针对 ...

  6. http 文件传输

    http 文件传输 https://www.zhihu.com/question/58118565 转载自:http://www.voidcn.com/article/p-rpdhbjib-m.htm ...

  7. 3.linux基本操作命令

    2018年2月20日星期二 Linux常见操作命令 Linux 操作命令? ●查看进程是否启用? ps -aux|less ●查看磁盘剩余空间? cat /proc/meminfo 校验内存使用 ●s ...

  8. python中的get

    get()根据键获取字典中的值,如果键不存在则返回一个默认值,默认值不填写则返回None 1 a = { 2 "name":"dlrb", 3 "ag ...

  9. 【3-28】javascript简介及语法

    一.简介 (一)定义:JavaScript是一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型,需有宿主文件:html文件. (二)作用:1.进行数据运算 2.对浏览器事件作出响 ...

  10. 关于 Container ,Injection

    1.容器的历史 容器概念始于 1979 年提出的 UNIX chroot,它是一个 UNIX 操作系统的系统调用,将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到这个新的 ...