简单入门Javascript正则表达式

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

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

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

1, hello.js
2, js.hello
3, hellojs
4, 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/i
console.log(a.test('heelo') //false
复制代码

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

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

let b=/[0]/;
console.log(b.test(9))  //fasle
console.log(b.test(90)) //true
复制代码
let a=/[abc]/;
console.log(a.test('a'))  //true
console.log(a.test('ac')) //true
console.log(a.test('abc')) //true
console.log(a.test('ABCD')) //false
复制代码
let a=/[*&$]/;
console.log(a.test('*'))  //true
console.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'))   //true
2.[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'))    //true
console.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')) //false
console.log(a.test('hello  ')) //false
^ 表示开头 意思和 $ 相反 即使空格也不行,一般^和$成对使用,可以构造出一些常用的正则表达式。
例如
由字母和数字组成,长度不限的话可以表示为
/^[A-Za-z0-9]$/
let a=/^[A-Za-z0-9]$/;
console.log(a.test('我a'))    //false
console.log(a.test('$123a')) //false
console.log(a.test('hello 23')) //fasle
console.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'))   //true
console.log(a.test('cc')) //true
console.log(a.test('ccc')) //true
console.log(a.test('cccc')) //false
其中{1,3}表示出现1-3个 
{1,}表示匹配一个或者一个以上
{1}表示只匹配一个。
复制代码

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值