正则表达式的作用
字符串匹配的利器
转义字符
- var str = "就想在双引号里写双引号\"怎么办?"
- 反斜线会把它后面的字符取消掉它的语法意思
- \n : 换行
- \r : 行结束符
- 一个回车等于 : \n\r
- \t : tab 缩进,等于4个空格
- \f:
-
多行字符串
var text = "\ <div></div>\ <div></div>\ "; var text = `<div></div> <div></div>`;
正则表达式
- 匹配特殊字符或有特殊搭配原则的字符串的最佳选择
- 它不是 JS 独有的,它是单独的一个
- 两种创建方式
- 直接量(推荐)
- 它是一个对象,写的方式是 //
var reg = /abc/; //正则表达式字面量
var str = "abcd";
reg.test(str); //true 测试字符串 str 是否含有我正则规定的片段 - 正则表达式的属性
- i : var reg = /abc/i; //ignoreCase 忽略大小写
- g :执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
var str = "abababab";
var reg = /ab/;
var a = str.match(reg); //只返回一个 ab
var reg = /ab/g;
var b = str.match(reg); //返回所有 ab,组成一个数组,可以查看.length 来看字符串里有多少个 ab - m :执行多行匹配。
var str = "abc\na";
var reg = /^a/g; //以a开头的
var a = str.match(reg); //只返回一个 a
var reg = /^a/gm; //以a开头的
var b = str.match(reg); //只返回所有 a 组成数组 - 可以把三个属性自由组合 var = /abc/mig;
- 它是一个对象,写的方式是 //
- new RegExp();
- var reg = new RegExp("abc");
var str = "abcd";
reg.test(str); //true - var reg = /abc/;
var reg1 = new RefExp(reg);//这两个对象虽然形式上一样了,但是相对独立,自己加属性不会相互干扰
var reg2 = RefExp(reg);//这个 reg 和 reg2 就是指向同一个引用了,一个变两一个会跟着变了 - 同样可以写属性,只不过在构造函数的第二个参数上实现
var reg = new RegExp("abc", "igm");
- var reg = new RegExp("abc");
- 直接量(推荐)
-
- 正则表达式方法 .test() //返回结果只有 true 和 false
var reg = /abc/;
var str = "abcd";
reg.test(str); //true - 字符串方法 .match() //把匹配的结果都返回回来
var str = "abababab";
var reg = /ab/;
var a = str.match(reg); //只返回一个 ab
var reg = /ab/g;
var b = str.match(reg); //返回所有 ab,组成一个数组,可以查看.length 来看字符串里有多少个 ab - 字符串方法 .replace()
var str = "aa";
console.log(str.replace("a", "b")); //输出 ba 因为 replace 本身没有匹配所有 a 的能力
var reg = /a/;
console.log(str.replace(reg, "b")); // 也输出 ba
var reg = /a/g; //带上全局属性 g 后
console.log(str.replace(reg, "b")); // 输出 bb
var reg = /(\w)\1(\w)\2)/; var str = "aabb";
console.log(str.replace(reg, "$2$2$1$1")); //输出 bbaa, 这里的 $1 代表引用正则里的第一个表达式所筛选数来的值
console.log(str.replace(reg, function($,$1,$2){
return $2 + $2 + $1 + $1;
//这里的 $ 代表整个 str
}));
- 正则表达式方法 .test() //返回结果只有 true 和 false
- 之前的 var reg = /abc/g; 是一个固定的写法,如果我们想要一个三个任意数字组成的字符串,那么就需要用表达式
括号用于查找一定范围的字符串:- [abc] 查找方括号之间的任何字符。 一个括号,代表一位
var reg = /[0123456789][0123456789][0123456789]/g 三个任意数字组成的字符串 - [0-9] 查找任何从 0 至 9 的数字。
var reg = /[0-9][0-9][0-9]/g 三个任意数字组成的字符串
var reg = /[0-9A-Za-z]/g 任意数字和字符串 - 尖角号放在表达式里代表 “非”
var reg = /[^a][^b]/g; 查找所有第一位不是a 第二位不是b 的两位字符串
var str = "ab1cd"; str.match(reg); //返回 ["b1", "cd"] - (x|y) 查找由 | 分隔的任何选项。
var reg = /(abc|bcd)/g; 查找所有 abc 或者 bcd - reg = /(\w)\1\1\1/; 这里的括号代表子表达式,这括号会记录里面匹配的内容; \1 代表引用第一个子表达式里匹配出的内容,所以这个就匹配 aaaa 或者 bbbb 等 四个一样的数字,字母,加下划线
- reg = /(\w)\1(\w)\2/ 这个就匹配 aabb 了
- \w === [0-9A-z_] 就是数字,字母,加下划线
var reg = /\w/g - \W === [^\w] 所有 非数组并且非字母并且非下划线
- \d === [0-9]查找数字。 试一试
- \D === [^\d] 查找非数字字符
- \s === [\t\n\r\v\f ] 查找空白字符。 试一试
- \b 匹配单词边界。 试一试
var str = "abc bcd deg"; //有6个单词边界
var reg = /\btracy\b/; 查到单词 tracy - \uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。 比如说可以匹配汉字,我们先把汉字转换成 Unicode
- 如何匹配一切单个字符 : var reg = /[\d\D]/g; 利用补集
- . 查找单个字符,除了换行和行结束符。 差不多就代表一切了
- n+; 代表 n 这个变量可以出现 一次到无数次
var reg = /\w+/g; - n * 0到无数次
- 正则表达式匹配原则: 贪婪匹配
- [abc] 查找方括号之间的任何字符。 一个括号,代表一位
- reg.exec(); 方法 检索字符串中指定的值。返回找到的值,并确定其位置。
var reg = /ab/g;
var str = "ababab";
console.log(reg.exec(str));
reg 挂着 g 属性的时候,游标在向后变化,所以在第4次执行 reg.exec(str) 会返回 null; 游标就是 reg.lastIndex 属性
如果 不挂着 g, 游标不变 一直为 0 - 题
- var reg = /^\d[\s\S]*\d$/g; 检测一个字符转首尾是否有数字
- 把 the-first-name 变成小驼峰 theFirstName
规律就是把 -f 变成 F,把 -n 变成 N
var reg = /-(\w)/g;
var str = "the-first-name";
var str2 = str.replace(reg, function($,$1){return $1.toUpperCase();}); - 科学计数法
var str = 10000000;// 变成 10.000.000
var reg = /(?=(\B)(\d{3})+$)/g;
var str2 = str.replace(reg,".");
1 . 校验密码强度
密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。
^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
2. 校验中文
字符串仅能是中文。
^[\\u4e00-\\u9fa5]{0,}$
3. 由数字、26个英文字母或下划线组成的字符串
^\\w+$
4. 校验E-Mail 地址
同密码一样,下面是E-mail地址合规性的正则检查语句。
[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?
5. 校验身份证号码
下面是身份证号码的正则校验。15 或 18位。
15位:
^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$
18位:
^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$
6. 校验日期
“yyyy-mm-dd“ 格式的日期校验,已考虑平闰年。
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
7. 校验金额
金额校验,精确到2位小数。
^[0-9]+(.[0-9]{2})?$
8. 校验手机号
下面是国内 13、15、18开头的手机号正则表达式。(可根据目前国内收集号扩展前两位开头号码)
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$
9. 判断IE的版本
IE目前还没被完全取代,很多页面还是需要做版本兼容,下面是IE版本检查的表达式。
^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$
10. 校验IP-v4地址
IP4 正则语句。
\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b
11. 校验IP-v6地址
IP6 正则语句。
(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))
12. 检查URL的前缀
应用开发中很多时候需要区分请求是HTTPS还是HTTP,通过下面的表达式可以取出一个url的前缀然后再逻辑判断。
if (!s.match(/^[a-zA-Z]+:\\/\\//))
{
s = 'http://' + s;
}
13. 提取URL链接
下面的这个表达式可以筛选出一段文本中的URL。
^(f|ht){1}(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&=]*)?
14. 文件路径及扩展名校验
验证windows下文件路径和扩展名(下面的例子中为.txt文件)
^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?"<>|]+\\.txt(l)?$
15. 提取Color Hex Codes
有时需要抽取网页中的颜色代码,可以使用下面的表达式。
^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$
16. 提取网页图片
假若你想提取网页中所有图片信息,可以利用下面的表达式。
\\< *[img][^\\\\>]*[src] *= *[\\"\\']{0,1}([^\\"\\'\\ >]*)
17. 提取页面超链接
提取html中的超链接。
(<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\\/\\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^"]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>
18. 查找CSS属性
通过下面的表达式,可以搜索到相匹配的CSS属性。
^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1}
19. 抽取注释
如果你需要移除HMTL中的注释,可以使用如下的表达式。
<!--(.*?)-->
20. 匹配HTML标签
通过下面的表达式可以匹配出HTML中的标签属性。
<\\/?\\w+((\\s+\\w+(\\s*=\\s*(?:".*?"|'.*?'|[\\^'">\\s]+))?)+\\s*|\\s*)\\/?>
作者:技匠
链接:https://www.jianshu.com/p/e7bb97218946
来源:简书
著作权归作者所有。