注意点: 正则是使用到字符串上的, 在 javascript 弱语言中有时候你可能会使用到数字的时候, 注意也要转换成字符串
一定义正则的方式
1 简单直接的定义方式(常用这种方式)
var reg = /javascript/gi
2 使用对象方式创建一个正则(这种方式的使用创建要匹配的内容是一个变量)
var reg = new RegExp('javascript', gi)
二元字符的认识
1 具有特殊意义的元字符
\: 转义字符, 转义后面字符所代表的含义
^: 以某一个元字符开始
$: 以某一个元字符结束
\n: 匹配一个换行符
. : 除了 \ n 以外的任意字符
\o:NUL 字符(\u0000)
\t: 制表符(\u0009)
\v: 垂直制表符(\u000B)
\f: 换页符(\u000C)
\r: 回车符(\u000D)
2 代表出现次数的量词元字符
*: 出现 0 到多次
+: 出现 1 到多次
?: 出现 0 次或者 1 次(或取消捕获时候的贪婪性)
{n}: 出现 n 次
{n,m}: 出现 n 到 m 次
三修饰符的认识
x|y:x 或 y 中的一个
[xyz]:x 或 y 或 z 中的一个
[^xyz]: 除了 xyz 以外的任意一个字符
[a-z]:a-z 之间的任何一个字符
[^a-z]: 除了 a-z 之间的任何一个字符
\d: 一个 0~9 之间的数字
\D: 除了 0~9 之间的数字以外的任何字符
\b: 一个边界符
\w: 数字字母下划线中的任意一个字符
\s: 匹配一个空白字符空格
(): 分组, 把一个大正则本身划分成几个小的正则, 例如:
- var reg = /^(\d+)zhufeng(\d+)$/
- ;
四几个修饰符
1g 表示全局匹配
2i 表示忽视大小写
3m 表示可以多行匹配
五 [] 的使用
1 在中括号中出现的所有的字符都是代表本身的意思的字符(没有特殊含义)
- var reg = /[.]/ // 匹配到.
- var reg = /\./ // 匹配到.
2 表示任意一个字符
- var reg = /[xyz]/ // 表示匹配 x 或 y 或者 z
- var reg = /[a-zA-Z]/ // 表示 a-z 或者 A-Z 中任意一个
3 中括号不识别两位数
- var reg = /^[12]$/; // --> 1 或者 2 中的一个(符合[xyz])
- var reg = /^[12-68]$/; // --> 12-6 中的一个 8 三个中的一个
- var reg = /^[\d]+$/; // 表示匹配一个或者多少数字
六 () 的作用(类似数学一样的改变运算的优先级)
1 分组的使用
- var reg = /^18|19$/; // 18191811891198191819 这些都符合
- var reg = /^(18|19)$/; // 只能 18 或者 19
七正则中几个重要的方法
1test 方法用于测试给定的字符串是否符合条件, 返回 true 或者 false
- var reg = /[x|y]/
- reg.test('|')
2match 把所有和正则匹配的字符都获取到(简单理解就是提取内容)
- var str = 'hello JAVA and javascript';
- str.match(/java/gi); // 返回["JAVA", "java"]
3exec 匹配(一步一步的执行)
会返回一个 Array, 第一个元素是匹配到的元素, 第二个元素是匹配到的元素在字符串中的位置, 第三个元素是整个字符串, 如果没有匹配到就返回 null
- var str = 'hello JAVA and javascript';
- var reg = /java/gi;
- reg.exec(str); // 返回["JAVA", index: 6, input: "hello JAVA and javascript"]
- reg.exec(str); // 返回["java", index: 15, input: "hello JAVA and javascript"]
- reg.exec(str); // 返回 null
4split 切割(也许你会说字符串本身就有 split 合并用正则的 split)
'a b c'.split(''); // 返回["a","b","", "","c"]'a,b, c d'.split(/[\s\,]+/); // 返回["a","b","c","d"]
** 下面这个是我项目中使用到了, 文字高亮 **
- var str = 'helloJAVAandjavascript';
- str.split(/(java)/gi); // 返回["hello", "JAVA", "and", "java", "script"], 然后再利用标签拼接
5replace 替换, 在字符串中也提供了一个相同的方法
使用字符串的替换
- var str = 'iceman2016iceman2017';
- str.replace('iceman','shoushou');
使用正则的替换
- var str = 'iceman2016iceman2017';
- str.replace(/iceman/g, 'shoushou');
第二个参数还可以是函数
- var str = 'iceman2016iceman2017';
- str.replace(/iceman/g, function () {
- // 第一次执行匿名函数输出 arguments 的结果:["iceman", 0, "iceman2016iceman2017"]
- // 第二次执行匿名函数输出 arguments 的结果:["iceman", 10, "iceman2016iceman2017"]
- console.log(arguments);
- return 'shoushou';
- });
6search 搜索方法, 搜索到匹配的内容返回下标, 否则返回 - 1
- var str = 'hello JAVA and javascript';
- str.search(/java/i);
八部分案例
1 匹配身份证号码
- var reg = /^(\d{2})(\d{4})(\d{4})(\d{2})(\d{2})(?:\d{2})(\d)(?:\d|X)$/;
- var str = "350324202904190216";
- str.match(reg)
2 把数字转换为大写数字
- var ary = ['零', '壹', '贰', '叁', '肆', '伍', '陆','柒', '捌', '玖', '拾'];
- '200801'.replace(/\d/g, (args1, args2, args3) => {
- // 第一个参数的匹配到的数字, 第二个参数是匹配到的 index, 第三个参数的整个字符串
- console.log(args1, args2, args3)
- return ary[args1]
- })
3 英文首字母大写
- var str = 'hello word';
- str.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase());
来源: https://juejin.im/post/5a976e895188257a7262ec38