正则中的小九九
正则也用了很多了,而真正自己写的正则到真是寥寥无几呀,不是粘贴复制,就是粘贴复制修改,有时候对于一些正则还不是很理解匹配的过程,觉得这作为程序员最基本的知识还是应该自己写一下正则比较好,所以重新又看了一下正则,做一下记录,以备以后自己复习和使用;
正则主要是用于操作字符串
-
作用:
- 验证字符串是不是合法
- 查找符合制定特征的字符串
- 替换字符串
-
前提知识点:
- 零宽度:子表达式匹配的仅仅是个位置,或者匹配的内容并不保存到最终的匹配结果中,就认为这个子表达式是零宽的,(其实就是表达式匹配的开始位置和结束位置是一个位置);如:"^ $ (?=xxx) (?!=xxx)"
- 占有字符:子表达式匹配的是字符内容不是位置,并保存在最后的匹配结果中
var reg = /abc/; 可以认为/a/ /b/ /c/ 都是子表达式
-
表达式
-
申明方式:
- 构造函数:
var reg1 = new RegExp("xyz",'gi'); //参数一:正则内容 //参数二:修饰符; // i:不区分大小写; // g:全局匹配; // m:多行匹配,遇到换行符也不结束,匹配到到字符串结束;
- 字面量:
var reg = /xyz/gi;
- 构造函数:
-
方法:
- reg.test() //返回true|false
var reg = /zyx/i; var str="zyxaa" reg.test(str) // true;
- exec方法、compile方法 可以自行了解
- 其他使用的都是字符串的方法,不是正则方法;
- reg.test() //返回true|false
-
匹配多字符
表达式 匹配范围 占位 表达式 匹配范围 \d 任意一个数字,0~9 中的任意一个 \D匹配取非 \W \w 任意一个字母或数字或下划线 \s 任意一个数字,0~9 中的任意一个 \B匹配位置(\b 取非的位置) \b 匹配一个单词边界,一个位置:(其中一边是 "\w" 范围,另一边是 非"\w" 的范围) . 除了换行符(\n)以外的任意一个字符 [^12A-Z]取补集 [12A-Z] 匹配中括号中的任意一个1或2或A到Z的字符 ^ 匹配开始位置,不匹配任何字符 $ 匹配结束位置 两边表达式是或的关系 () 子表达式开始和结束的位置 - 次数修饰
表达式 匹配范围 占位 表达式 匹配范围 {n} 重复n次 {m,} 重复至少m次数 {m,n} 重复次数在[m,n]这个范围 ? 重复0到1次 相当于{0,1} + 重复次数大于等于1 相当于{1,} * 重复任意次数 相当于{0,} -
-
匹配过程:
- 对于整个表达式来说,一般是从字符串位置0处开始尝试,中间有回溯等一些处理,如何匹配成功则返回,接着从成功之后的位置接着匹配,如何失败,就从位置1重新开始之前的匹配,以此类推,直到成功或者是匹配失败;
- 对于子表达式来说: 开始匹配的位置是上一个表达式匹配成功结束的位置;
-
例如下面匹配:
reg0.jpg
-
正则表达式一些特殊的用法
-
匹配次数的贪婪与非贪婪
-
贪婪模式:正则默认情况是贪婪模式:在可以让整个表达式匹配成功的前提下,尽可能最多的去匹配字符串
reg1.jpg
-
非贪婪匹配:在匹配次数修饰符({m,n}/?+*)之后加上"?" 则在可以让整个表达式匹配成功的前提下,尽可能少的去匹配字符串;
reg2.jpg
-
-
捕获组的引用:
- 括号"( )"在正则中括号的作用(起到分组的效果):
- 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰;
- 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到;
- 捕获组 : 就是把正则表达式中子表达式(括号中的表达式)匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。
- 引用:可以在正则表达式内部引用\number (反向引用), 也可以在正则表达式外部引用$number
- 引用number是和子表达式左侧括号出现的顺序相对应的
- 括号 "( )" 内的子表达式,如果希望匹配结果不进行记录供以后使用,可以使用 "(?:xxxxx)" 格式
- 括号"( )"在正则中括号的作用(起到分组的效果):
-
正则断言(正向、负向、先行、后行)
js中不支持后行断言,所以只介绍先行:
- (?=pattern) 正向先行断言
//代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配pattern。 - (?!pattern) 负向先行断言
//代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配pattern。
- (?=pattern) 正向先行断言
-
- 常用正则:
- 只允许字母数字下划线,必须含有大小写和数字和下划线
var reg=/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*\_)\w{8,20}$/;
网友评论