博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单入门Javascript正则表达式
阅读量:6248 次
发布时间:2019-06-22

本文共 3575 字,大约阅读时间需要 11 分钟。

我们已经会熟练使用js字符串类型了,例如你想知道一个变量是否等于一个字符串,可能可能这样判断

if(a=='hello,world'){    ...}复制代码

但是往往我们有时候对一些字符串判断显得力不从心,例如判断一个文件的类型是否为js类型,可能有下面几种文件名格式

1, hello.js2, js.hello3, hellojs4, helljso复制代码

以我们人脑的认知来看,我们一眼能够看出只有第一个符合我们的要求,但是我们怎么写这个判断程序呢?例如我们可以这样判断,例如js字符串方法,从右边往左边取三位,如果为‘.js’则匹配成功。 但是我问一下如果文件名描述为hello..js呢?显然,这种方法不太适合,所以需要正则表达式来进行精确匹配了。 正则表达式用于描述一种特征,就例如你描述某某女生长得怎么样一样。例如瓜子脸,一米六到一米七,长头发... 同理我们可以使用正则表达式来描述我们需要的字符,例如邮箱格式:

一串数字或者字母+@+字符串或者数字+'.'+'数字或者字符串'复制代码

我们怎么用代码来描述我们的这个对象呢,我们可以使用例如下面的写法

var a=/hello/i或者var a = new RegExp('hello',i);复制代码

/ / 之间写入你的匹配规则 后面加一个修饰符i 或者g或者m

i表示忽略大小写,即人为HELLO和hello是一样的g表示全局,多用在匹配和搜索中,我们先暂且不管。m表示多行匹配复制代码

我们首先学会怎么描述规则,即怎么写/ /之间的规则 对于某种特征一般有一下几种关系。

  1. 精确的。例如字符为'hello'的,只需/hello/即可,如果你接收HELLO,即/hello/i即可
  2. 含有,例如0-9之间
  3. 范围加限定长度,例如我需要匹配长度为4的0-9之间数字
  4. 边界的,例如 结尾为.js 或者开头为020-的电话格式

对于我们是否写对了规则,我们可以用test()方法试一试 test()好比一面照妖镜

var a=/hello/iconsole.log(a.test('heelo') //false复制代码

说明heelo和a不匹配,是个假的。 下面分别说明上述几种

  1. 包含[],这种关系类似于数学之中排列组合,例如[abc],代表a,b,c所能组成的各种组合
let a=/[0-9]/;console.log(a.test(9))  //trueconsole.log(a.test(90)) //trueconsole.log(a.test('90')) //trueconsole.log(a.test('90SS')) //trueconsole.log(a.test('ABCD')) //falselet b=/[0]/;console.log(b.test(9))  //fasleconsole.log(b.test(90)) //true复制代码
let a=/[abc]/;console.log(a.test('a'))  //trueconsole.log(a.test('ac')) //trueconsole.log(a.test('abc')) //trueconsole.log(a.test('ABCD')) //false复制代码
let a=/[*&$]/;console.log(a.test('*'))  //trueconsole.log(a.test('*$')) //true复制代码

下面有几个常用的[]写法

1.[a-z] 包含字母    let a=/[a-z]/;    console.log(a.test('a'))  //true    console.log(a.test('Z')) //false 因为区分大小写    console.log(a.test('abc')) //true    console.log(a.test('aS'))   //true2.[A-Za-z0-9]包含大写或小写字母或数字复制代码

单单使用[]是有局限的,因为它能匹配的实在是太宽泛了,只要包含即可。例如[a-z],对于字符'a2'也是符合的。要使得我们匹配更加精确,正则表达式还有许多武器,例如元字符。 元字符个人理解是一种限制规则来缩小匹配范围 一般来说有

限定属性以及长度。

\d 表示匹配一位整数 相反\D匹配一个非数字;   \w 表示匹配一位英文单词 相反\W匹配一个非英文单词;   \s 表示匹配一位空格 相反\S匹配一个非空格;   ...   更多可以参考 http://www.runoob.com/jsref/jsref-obj-regexp.html复制代码

使用这个有什么用呢?你已经知道了属性和长度,你可以去检测某些连在一起的特征,例如你现在有一篇英文的文章,我需要找到特征: 3位数字+3位字母的部分标红:

let txt='s23df12S456abx';  ==> /\d\d\d\w\w\w/let a=/\d\d/;console.log(a.test('1'))    //false console.log(a.test('12'))    //trueconsole.log(a.test('1ac2'))  //false 必须两个相连let b=/\s/;console.log(b.test('my file.js')) //true 检测是否含有空格复制代码

限定位置

我们已经会使用属性加长度了,但是有时候往往我们也需要位置的限定 。下面列举几个常用的元字符

$ 表示结尾 例如/js$/表示js不能再有任何字符串了,空格也不行let a=/hello$/;console.log(a.test('hello'))    //true console.log(a.test('hello world')) //falseconsole.log(a.test('hello  ')) //false^ 表示开头 意思和 $ 相反 即使空格也不行,一般^和$成对使用,可以构造出一些常用的正则表达式。例如由字母和数字组成,长度不限的话可以表示为/^[A-Za-z0-9]$/let a=/^[A-Za-z0-9]$/;console.log(a.test('我a'))    //falseconsole.log(a.test('$123a')) //falseconsole.log(a.test('hello 23')) //fasleconsole.log(a.test('hello23 ')) //false复制代码

如果想要使得空格也可以匹配 可以使用\b \b表示边界,可以为开头或者结尾 例如 ' hello,world '

let a=/\bhi\b/;      console.log(a.test('hi'))    //true      console.log(a.test('him')) //false 后面有m      console.log(a.test('hi m')) //true hi是单独的      console.log(a.test('shi')) //false 前面有s复制代码

量词使用

例如我们想匹配连续三个数字,我们可以:

/\d\d\d/复制代码

假如要匹配100个呢 写100个吗?我们不可能手动写100个吧 我们有下面几个常用的表述:

  1. +表示重复 n+匹配任何包含至少一个 n 的字符串。 /abc+/ 可以匹配 abc abcc abccccc abccccd
  2. *表示匹配任何包含至少0个或者一个 n 的字符串
/abc*/ 可以匹配 ab abc abccc abccd 可以不包括c复制代码
  1. {}使用 上述+和*号范围都可以多到无限多。但是要表示具体多少个呢 我们可以使用{},这类似于数学里的表示范围[a,b]
let a=/^c{1,3}$/;console.log(a.test('c'))   //trueconsole.log(a.test('cc')) //trueconsole.log(a.test('ccc')) //trueconsole.log(a.test('cccc')) //false其中{1,3}表示出现1-3个 {1,}表示匹配一个或者一个以上{1}表示只匹配一个。复制代码

当然还有许多正则表达式规则了,实在写不完了,读者可以自行百度。(完)

转载于:https://juejin.im/post/5be983cc6fb9a049d2359488

你可能感兴趣的文章
655. Print Binary Tree
查看>>
jsp 中对jar 包的引用
查看>>
python操作mysql数据库
查看>>
Yii: gii 403 Error you are not allowed to access this page
查看>>
Android SVG矢量资源的使用方法
查看>>
计算汉字长度
查看>>
RSA签名验签学习笔记
查看>>
Codeforces 911E - Stack Sorting
查看>>
BZOJ 1853: [Scoi2010]幸运数字
查看>>
Pessimistic and optimistic locking
查看>>
基于敏捷的测试交付物通用设计
查看>>
svn变更自动触发jenkins构建工程-简单版
查看>>
BFS --- 素数环
查看>>
for循环每次取出一个字符(不是字节)
查看>>
linux版本选择
查看>>
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
查看>>
Java DynamoDB 增加、删除、修改、查询
查看>>
【转】linux下 postgres的一些操作总结
查看>>
不写for也能选中checkbox!
查看>>
PCIE_DMA:xapp1052学习笔记
查看>>