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>