正则表达式
正则表达式
1.定义
- 对字符串进行描述的
2.作用
- 表单验证
- 验证 邮箱/电话/邮编......
- WEB编辑器
- 爬虫、数据抓取、小偷程序
3.定义正则表达式
- 直接量
- 函数
- 构造函数
正则表达式基础
1.原子
- 正则表达式的最小组成单位
- 普通的字母、数字、符号都是原子
- 转义字符
- 字符类
2.字符直接量(原子)
- 原子的重要组成
- 普通的字母、数字、符号
- \n
- \t
- \r
- \v
- \f
- \
- \b 退格符
- \x00
- \u0000
- \unicode编码
- 正则表达式里面具有特殊意义的字符 需要转义
3.字符类(原子)
- \d 数字 [0-9]
- \D 除了数字之外的字符 [^0-9]
- \w 数字、字母、下划线 [0-9a-zA-Z_]
- \W 除了数字、字母、下划线 之外的字符 [^0-9a-zA-Z_]
- \s 空白符 [\n\t\v\r\f ]
- \S 除了空白符之外的字母 [^\n\t\v\r\f ]
- . 除了换行外所有的字符 [^\n\r]
- [...]
- [^...]
- [\b] 匹配退格符
4.重复(对原子的数量修饰)
-
+
表示前面原子出现1次或多次 -
?
表示前面原子出现0次或1次 -
*
表示前面的原子出现0次1次或多次 任意次 -
{m} 前面的原子出现m次
-
{m,n}前面的原子出现m到n次
-
{m,} 前面出现的原子个数m次以上
-
正则默认会贪婪匹配,阻止贪婪匹配在数量修饰符的后面 加?
var reg = /\w+e/; var reg = /\w+?e/; var str = "orangeapple"; console.log(reg.exec(str));
5.指定匹配出现的位置(对原子位置的修饰)
-
\b 单词边界
-
\B 不是单词边界
-
^ 字符串开始边界
-
$ 字符串结束边界
-
先行断言(正向预查) (?=)
console.log(/apple(orange)/.exec("appleorange")) console.log(/apple(?=orange)/.exec("appleorange")); console.log(/apple(?=orange)/.exec("orangeapple"));//null console.log(/apple(?!orange)/.exec("orangeapple")); console.log(/apple(?!orange)/.exec("appleorange"));//null console.log(/apple(?!orange)/.exec("appleab"));
-
负向先行断言(负向预查) (?!)
console.log(""); console.log(/(?=p)apple/.exec("apple"));//null console.log(/(?=p)apple/.exec("papple"));//null console.log(/apple(?=p)/.exec("applep"));//["apple", index: 0, input: "applep"] console.log(/^apple(?=p)$/.exec("applep"));//null
正向:
(?=exp) 零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式。
(?<=exp) 零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式。
负向:
(?!exp) 零宽度负预测先行断言,它断言此位置的后面不能匹配表达式。
(?<!exp) 零宽度负回顾后发断言,它断言此位置的前面不能匹配表达式。
6.模式单元 ()
-
改变优先级
//改变优先级 console.log(/apple|orange/.test("apple")); console.log(/appl(e|o)range/.test("apple")); console.log(/appl(e|o)range/.test("applorange")); console.log(""); /*控制台输出 true false true */
-
把多个原子当做一个原子
//把多个原子当做一个原子 console.log(/abc{4}/.test("abcccc")); console.log(/(abc){4}/.test("abcccc")); console.log(/(abc){4}/.test("abcabcabcabc")); /* true false true */
-
把模式单元匹配的内容暂存内存 (?😃 可以取消暂存内容
//模式单元的内容会 单独存储到内存中 console.log(/abc/.exec("123abc123abc")); console.log(/a(b)c/.exec("123abc123abc")); console.log(/(ab)c/.exec("123abc123abc")); console.log(/(ab)(c)/.exec("123abc123abc")); console.log(/(ab)(?:c)/.exec("123abc123abc"));
-
暂存内存的内容可以被反向引用
7.修饰符(模式修正符)
-
i 正则表达式不区分大小写
// i 不区分大小写 console.log(/^aAbB$/.test("aabb"));//false console.log(/^aAbB$/i.test("aabb"));//true
-
m 允许多行(换行被当做字符串结束符)
// m 多行模式 字符串边界 console.log(/^a/.exec("orange\naplle"));//null console.log(/^a/m.exec("orange\naplle")); console.log(/\w$/m.exec("orange\naplle")); console.log(/\w$/.exec("orange\naplle"));
-
g 全局匹配
正则的使用
1.RegExp对象
- test() true/false
- exec() 数组/null
2.String对象
-
search() 匹配成功(第一次满足正则的位置) 匹配失败(-1)
//search console.log("abc123".search(/\d{2}/));//3 console.log("abc123".search(/^\d{2}/));//-1
-
match() 匹配成功(返回数组 全局匹配影响) 失败(null)
//match console.log("1abc34io".match(/[a-z]{2}/));//["ab", index: 1, input: "1abc34io"] console.log("1abc34io".match(/[a-z](\d)/));//["c3", "3", index: 3, input: "1abc34io"] console.log("1abc34io".match(/[a-z]{2}/g));//["ab", "io"] console.log("1abc34io".match(/[a-z]{9}/g))//null
-
replace() 替换
//replace console.log("hellolelabc".replace("l","艾尼"));//he艾尼lolelabc console.log("hellolelabc".replace(/l/g,"艾尼"));//he艾尼艾尼o艾尼e艾尼abc console.log("hellolelabc".replace(/\w/g,"艾尼"));//艾尼艾尼艾尼艾尼艾尼艾尼艾尼艾尼艾尼艾尼艾尼
-
split() 把字符串分割为数组
//split var message="jin.jack,rack,rose,tom.lili,yanyan"; console.log(message.split(","));//["jin.jack", "rack", "rose", "tom.lili", "yanyan"] console.log(message.split(/[,.]/));//["jin", "jack", "rack", "rose", "tom", "lili", "yanyan"]
判断邮箱var email=/[1]{1,12}@[\w.]{1,10}[\w]{1,5}$/;
判断密码var password=/[\w_]{6,18}/;
判断用户名var username=/[a-zA-Z_\w]{4,16}/;
实现 在表单中输入 银行卡 自动加4位加空格;
<form action="">
<input type="text" id="strInput" oninput="check()"><br>
</form>
<script>
function check(){
var str=document.getElementById("strInput");
str.value=str.value.replace(/\s/g,"").replace(/(\d{4})(?=\d)/g,"$1 ");
}
</script>
\w ↩︎