1、针对字符串的操作
正则表达式是针对字符串的操作,所以对于字符串来说,即使不用正则表达工式也可以实现相同的效果,只是会更加麻烦而已。除了正则,JS中对于字符串的基本操作有:
- search 找到某个字符串第一次出现的位置,找不到返回 -1
var str = 'sfjsf123'
str.search(2) // 6
- substring 类似切片
var str = 'acfed23rf'
str.substring(1,4) // cfe
- charAt() 接收位置参数,返回那个位置的字符
var str = 'sfged34qf'
str.charAt(2) //g
- split 使用分隔符将字符串切割成数组
var str = '12-df-23df-34'
str.split('-') // ['12', 'df', '23df', '34']
2、用正则表达式来操作字符
正则表达式是 regular expression的缩写,意为有规律的表达式。
- 在JS中创建正则的方式及常用语法
var re = new RegExp('a','i') //i是匹配的过程中忽略大小写,g是全局匹配
var str = 'fed345afj-sko'
re.test(str) //true 如果匹配不到则返回false
等价于
var re = /a/i //参数i,还有g
var str = 'fed345afj-sko'
re.test(str) //true
- search,match,replace,与正则的配合使用
var str = 'afb-136-Afd45!'
str.search(/a/i) // 0
match 挑出符合匹配的内容
var str = 'afb-136-Afd45!'
str.match(/\d/) //只返回第一个匹配值,1,以数组的形式,如果想要挑出全部的匹配项,需要加参数g
str.match(/\d/g) // ['1','3','6','4','5']
replace也经常与正则配合使用
var str = 'a135sfg-gje23A'
str.replace(/a/gi, 'B') //'B135sfg-gje23B' replace接收两个参数,一个查找的字符,另一个替换的字符
3、正则表达式的基础使用
var str = '1a2451b245'
var re = /1[abc]2/g //[]表示或者的关系,里面只有存在一个字符,[abc]表示a或者b或者c, [a-z]表示任意字母,[0-9]表示0-9的任意数字,[a-z0-9]表示任意字母或数字
var re2 = /1a2|1b2|1c2/g //与上一行代码等价,只是麻烦 ,| 表示或者关系。
var re3 = /[^1]/ //[^1]表示除了1的任意字符
var re4 = /./ //.表示任意字符
var re5 = /\d\w/gi // \d表示任意数字,相当于[0-9]; \w表示任意字母、数字和下划线,等价[a-z0-9_]
var re6 = /\s/ //\s就是指一个空格
var re7 =/\D\W\S/ // \D表示非数字,相当于[^0-9],\S表示除了空格,等价[^\s],\W表示除了字母、数字和下划线的任意字符
**量词**
var re8 = /a{1,5}/ //表示a最少出现1次,最多出现5次
// {m,n}最少出现m次,最多出现n次; {m, }最少m次最多不限; {m}表示正好出现m次
var re9 = /[1-9]\d{4,10}/g; 表示QQ号的正则
// + 就是{1, } 最少一次,最多不限
//*就是{0, }最少0次最多不限(不建议使用)
//?就是{0,1}可以出现也可以不出现,出现的话就只有1次
**行首行尾、单词边界**
var re10 = /^\w+@[a-z0-9]\.[a-z]{2,4}$/ 注意\.的转义 ^在[]表示除了,在外面单独使用则表示行首
var re11 = /\bmybike\b/
**中文检测**
var str2 = 'sfsi34!@#我'
var re12 = /[\u4e00-\u9fa5]/
re.test(str2)
4、分枝和分组
正则表达式里的分枝条件就是有几种规则,只要满足其中的任意一种规则都应当匹配,具体的使用方法是用 | 将不同的规则分隔开来
var re13 = /0\d{2}-\d{8}|0\d{3}-\d{7}/
之前提到了对于一个字符的重复可以使用量词,但是对于多个字符的重复使用应该怎么用
var re14 = /^(\d{1,3}\.){3}\d+$/
5、后向引用
后向引用就是通过一个小括号来指定一个子表达式,在匹配这个子表达式的文本(捕获)的同时也可以将这个子表达式用于后面的表达式内容
var a = 'my kitty kitty is a cat'
var re15 = /\b(\w+)\b\s+\1\b/
re15.test(a) // true 可以匹配 kitty kitty 这部分字符串
默认的子表达式,也就是分组的组名是\1,也可以自己指定:(?<name>\w+)
6、零宽断言和负向零宽断言
零宽断言就是查找某些内容,但不包括这些内容的之前或者之后的内容
(?=exp) 匹配exp前面的内容
(?<=exp) 匹配exp后面的内容
var re16 = /\b\w+(?=ing\b)/ //匹配singing中的sing或者dancing中的danc部分
var re17 = /(?<=\bre)\w+\b/ //匹配reading中的ading, receive中的ceive部分
负向零宽断言就是断言这个位置的前面或者后面不匹配什么样的字符
(?!exp) 断言这个位置后面不能匹配exp
var re = /\d{3}(?!\d)/ 表示匹配三位数字,而且这三位数字后面不能再出现数字 '123ab','354@~' 中只匹配了123和354
(?<!exp) 断言这个位置的前面不能有exp
var re = /(?<!\d)[a-z]{3}\b/ 匹配前面不是数字的三个小写
7、贪婪和懒惰
var re = /a.*b/ 将匹配以a开始以b结尾的最长的字符串(贪婪模式)
var re = /a.*?b/ 将匹配任意数量的重复,但是在能使匹配成功的前提下使用最少的重复(懒惰模式),比如
用它来匹配aaabab将匹配到aaab和ab,而不会匹配aaab中的后两个字符ab