Fork me on GitHub

JavaScript正则学习笔记

一、正则表达式基础

正则表达式乐意理解为一种规则和模式,用于匹配特定的字符串,所以它只是针对于字符串,那么自然需要先了解一些正则中常用的字符串的方法,以便于与正则进行结合。

(一)字符串基础

1、字符串常用方法

  • search

用于检索字符串中的子字符串,或者检索与正则表达式匹配的子字符串。

参数:字符串或者正则表达式

返回值:返回第一个与参数相匹配的子字符串的位置,如果没有检索得到匹配的子字符串就返回-1

注意:该方法不执行全局匹配,忽略标识g;大小写敏感,除非正则表达式显示指定忽略大小写i

<script>
    var str = "abcdefghijk"
    alert(str.search("b")) //结果为1
</script>
  • match

用于检索指定的值,检索到与正则表达式匹配的一个或多个值

参数:正则表达式

Array. 存放匹配结果的数组。

注意:正则表达式中是否有全局标志g

<script>
    var str = "abcd123efghi456jk"
    alert(str.match(/\d+/)) //123
    alert(str.match(/\d+/g)) //123,456
</script>
  • replace

用于字符串中一个字符替换为另一个字符,或者替换掉与正则表达式匹配的字符(子串)

参数:第一个参数表示替换的字符(字符串)或者正则表达式,第二个参数表示替换成什么样的字符(字符串)

返回值:一个新的字符串,是用 第二个参数替换了 regexp 的第一次匹配或所有匹配之后得到的

注意:正则匹配全局需要使用全局标志g

<script>
    var str = "abcd123efgahi456jk"
    alert(str.replace(/a/,"A")) //匹配第一个字符a,替换为A
    alert(str.replace(/a/g,"A")) //匹配全局所有字符a,替换为A
    alert(str.replace(/\d/,"A")) //匹配第一个数字,替换为A
    alert(str.replace(/\d/g,"A")) //匹配全局数字,替换为A
</script>

二、正则表达式

正则是RegExp对象,它有两种风格,分别是JS风格与perl风格,可以先看看它们的风格是怎么样的:

<script>
    var str = "abcd123efgahi456jk"
    re = new RegExp("a","i")  //JS风格
    re = /a/i  //perl风格
    alert(re.test(str)) //结果都是true
</script>

它们实现的效果都是一样的,但是第二种显然更简便一些。

(一)字符类

1、任意字符

  • [abc]

比如:m[abc]n--->man、mbn、mcn

<script>
    var str = "ma6 6bc mc6"
    alert(str.match(/m[abc]6/g)) //全局匹配ma6,mc6
</script>

2、范围

  • [a-z]、[0-9]、[A-Z]

比如:m[a-z]--->ma、mb、mc...

  var str = "ma66bcmc6"
  alert(str.match(/[a-z]/g)) //全局匹配[m,a,b,c,m,c]
</script>

注意:[]匹配的都是单个字符

3、排除

  • [^a]
<script>
 var str = "ma66bcmc6"
  alert(str.match(/[^a-z]/g)) //全局匹配[6,6,6] 排除a-z的英文字母
</script>

4、组合

  • [a-z0-9A-Z]

表示a-z0-9A-Z中的每一个字符或者数字

<script>
  var str = "ma66bcMc6LK"
  alert(str.match(/[a-z0-9A-Z]/g)) //全局匹配[m,a,6,6,b,c,M,c,6,L,K] 
</script>

5、转义字符

  • .(点)

表示任意的字符

<script>
  var str = "ma66bcMc6LK"
  alert(str.match(/./g)) //全局匹配[m,a,6,6,b,c,M,c,6,L,K]
</script>
  • \d、\w、\s

\d表示单个数字

<script>
  var str = "ma66bcMc_6LK"
  alert(str.match(/\d/)) //匹配第一个[6]
  alert(str.match(/\d/g)) //全局匹配[6,6,6]
</script>

\w表示单个字母、数字及下划线,如果匹配全部需要用全局标志g(相当于[a-z0-9_])

<script>
  var str = "ma66bcMc_6LK"
  alert(str.match(/\w/)) //匹配第一个字符、数字以及下划线[m]
  alert(str.match(/\w/g)) //全局匹配字符、数字以及下划线m,a,6,6,b,c,M,c,_,6,L,K
</script>

\s表示空格

<script>
  var str = " abc def "
  alert('('+str.replace(/\s/g,"")+')')
</script>
  • \D、\W、\S

\D表示非数字相当于[^0-9]

\W表示非小写字母、数字及下划线[^a-z0-9]

\S表示除了空白字符之外的字符

(二)量词

1、常用量词

量词表示的是出现的次数,常用的量词有:

  • {n,m}

至少出现n次,最多出现m次。

  • {n,}

至少n次

  • *

任意次,想当于{0,}

  • ?

零次或者一次,相当于{0,1}

  • +

一次或者任意次,相当于{1,}

  • {n}

正好n次

2、实例

  • 邮箱验证

邮箱的格式用汉语表示就是:一串数字、字母、下划线   @   一串英文、数字  .  一串英文(长度2-4),用正则表示就是:

#邮箱的正则表达式为
\w+@[a-z0-9]+\.[a-z]{2,4}

但是如果仅仅这样写,当前面有汉语时依然会匹配成功,所以正确的写法是开头匹配,以及必须有结尾标识符

#邮箱的正则表达式为
^\w+@[a-z0-9]+\.[a-z]{2,4}$
  • 检测中文
<script> 
 var str = "我是zhongguoren"
  var re=/[\u4e00-\u9fa5]/;
  alert(re.test(str))
</script>
  • 匹配QQ号

假设现在QQ号最少有5位,最多有11位

<script>
    var str = "25369815,523,89635471"
    console.log(str.match(/[1-9]\d{4,10}/g))
</script>
posted @ 2020-01-16 22:09  iveBoy  阅读(235)  评论(0编辑  收藏  举报
TOP