正则表达式
正则表达式是专门针对字符串而定义出来。
它是一组规则 通过特定的字符来表示不同的字符串类型
正则表达式的定义
- 字面量定义 /正则表达式/修饰符
- 构造函数定义 RegExp(正则表达式, 修饰符);
- new RegExp(“abc”, g)
- 第一个参数是正则表达式的表达体
- 第二个参数是正则表达式的修饰符
// 正则表达式是专门针对字符串而定义出来
// 它是一组规则 通过特定的字符来表示不同的字符串类型
// 第一种 字面量 定义正则表达式
// var reg = /sadfsadf/;
// 第二种 构造函数 定义正则表达式
// var reg1 = new RegExp("sadfsadf");
// console.log(reg == reg1); // false 因为它们是引用类型
// 检测字符串是否都是由字母a开头
// 正则表达式中的 边界符号
// ^表示开头 $表示结尾
/* ^ */
// var reg = /^a/; // 这个正则表达式的含义:以a字母开头
// var str = "abcdefg";
// var str1 = "babb";
// test方法
// console.log(reg, str, reg.test(str)); // 判定str字符串是否符合reg的含义
// console.log(reg, str1, reg.test(str1)); // 判定str1字符串是否符合reg的含义
/* $ */
// var reg = /com$/; // 该正则表达式的含义: 必须有c c后面必须是o o后面必须是m m必须是最后一个
// var netStr = "www.baidu.com";
// var netStr1 = "www.163.cn";
// console.log(reg, netStr, reg.test(netStr));
// console.log(reg, netStr1, reg.test(netStr1));
- 转义字符
- \d 所有的数字
// d 在正则表达式中就表示d字母本身
// 但是 \d 表示的就不是d了 表示的是数字
// var reg = /^\d\d$/;
// console.log(reg.test(1))
// console.log(reg.test("1"))
// console.log(reg.test("11"))
// console.log(reg.test("a"))
- \D 所有的非数字
- \w 所有的数字字母下划线
// \w 表示的是数字字母下划线
// var reg = /^\w$/;
// console.log(reg.test("a"));
// console.log(reg.test("1"));
// console.log(reg.test("_"));
// console.log(reg.test("$"));
- \W 所有的非数字字母下划线
- \s 所有的空白符
// \s 在正则表达式中 表示所有的空白符
// var reg = /^\s$/;
// console.log(reg.test(" "));
// console.log(reg.test(" "));
- \S 所有的非空白符
- 特殊字符(元字符)
- . 除了回车和换行之外的其它所有内容
- () 分组 分组内是一个整体
- [] 范围
- [a-z]
- [A-Z]
- [0-9]
- [0-9A-Za-z]
- {} 数量
- {10} 限定十个 不能多也不能少
- {3,5} 最少三个 最多五个
- {1,} 最少一个 最多无穷个
- ? 零个或一个
- + 一个或任意个
- * 零个或任意个
- | 或者
对于特殊字符的简单小例子
/* 元字符 */
// 元字符表示在正则表达式中的特殊字符 它表示的不是它本身 而是其它含义
// () [] {} ? * | ^ $ - + .
// 针对以上的元字符 如果想要在正则表达式中 表达它们本身的含义 需要转移 \元字符
// 定义一个字符串
// var str = "^$";
// var reg = /\^\$/;
// 此时 检测通过
// console.log(reg.test(str));
// ? 表示数量 0个或1个 针对前一个字符
// var str = "abcd.html";
// var str1 = "abcd.htm";
// 定义正则表达式
// var reg = /html?$/; // 含义: 判定是否是以html 或者以htm结尾
// console.log("通过" + reg + "规则 进行" + str + "的判定 结果是" + (reg.test(str)? "通过" : "不通过"));
// console.log("通过" + reg + "规则 进行" + str1 + "的判定 结果是" + (reg.test(str1)? "通过" : "不通过"));
// + 表示数量 1个或多个 针对前一个字符
// var str = "abcccccccc";
// var str1 = "abcccccccccccccccccccccccc";
// var str2 = "abccccccccccccccccccccccccccccccccccccccccccccccccccccccccc";
// var str3 = "ab";
// var reg = /abc+/; // 含义 包含a a后面是b b后面是至少1个c
// console.log(reg.test(str)); // true
// console.log(reg.test(str1)); // true
// console.log(reg.test(str2)); // true
// console.log(reg.test(str3)); // false
// * 表示数量 任意个 针对前一个字符
// var str = "abcccccccc";
// var str1 = "abcccccccccccccccccccccccc";
// var str2 = "abccccccccccccccccccccccccccccccccccccccccccccccccccccccccc";
// var str3 = "ab";
// var reg = /abc*/; // 含义 包含a a后面是b b后面是任意个c
// console.log(reg.test(str)); // true
// console.log(reg.test(str1)); // true
// console.log(reg.test(str2)); // true
// console.log(reg.test(str3)); // true
// {} 表示数量 可以写两个数字 可以写一个数字
// {数字} 表示前面的字符 必须出现多少个
// {数字1,数字2} 表示前面的字符 必须至少出现数字1个 最多出现数字2个
// {数字1,} 表示前面的字符 必须出现数字1个 最多不进行限制 {0,}等价于* {1,} 等价于+ {0,1} 等价于?
// // 定义一串数字
// var phoneNumber = "83554321233";
// // 定义正则
// var reg = /^\d{11}$/; // 含义: 整个字符串必须是11个连续的数字 不能有其它
// console.log(reg.test(phoneNumber))
// var phoneNumber = "83554321233";
// var phoneNumber1 = "1233";
// // 定义正则表达式
// var reg = /\d{3,11}/; // 含义: 字符串中必须包含 连续3位到连续11位之间的数字
// console.log(reg.test(phoneNumber));
// console.log(reg.test(phoneNumber1));
// 定义一串数字
// var phoneNumber = "1234";
// var phoneNumber1 = "1234567899999999999999999999999999999999999999999999999999999999999999999999";
// var str = "abc11def22ghi333";
// var reg = /\d{4,}/; // 含义: 字符串中必须包含至少连续四个数字 多了不限制
// console.log(reg.test(phoneNumber)); // true
// console.log(reg.test(phoneNumber1)); // trye
// console.log(reg.test(str)); // false
// () 表示分组
// ac.d.ghi.hjk.xxx
// a.def.g.hjk
// ab.df.g
// c.def.k.l.o.ps
// A.def.k.l.o.ps
// B.def.I.l.E.ps
// G
// 判定字符串是否是以上格式
// 总结规律: 开头必须是英文 后面的内容只要出现 必须是以.出现 .后面跟的也是英文 如果不出现 .也没有 英文也没有
// var reg = /\w+(\.\w+){0,}/; // 含义:字符串中包含 英文字母 后面跟的是 .英文字母这种格式的内容 这种格式的内容可以出现任意次
// console.log(reg.test("ac.d.ghi.hjk.xxx"));
// console.log(reg.test("a.def.g.hjk"));
// console.log(reg.test("ab.df.g"));
// console.log(reg.test("c.def.k.l.o.ps"));
// console.log(reg.test("A.def.k.l.o.ps"));
// console.log(reg.test("B.def.I.l.E.ps"));
// console.log(reg.test("G"));
// [] 表示一个区间 表示一个字符 该字符可以是这个区间中的任何一个
// 判定一个字母是否在a到h之间
// var reg = /^[a-h]$/; // 含义 检测一个字母 该字母必须在a~h之间
// console.log(reg.test("a"));
// console.log(reg.test("b"));
// console.log(reg.test("c"));
// console.log(reg.test("d"));
// console.log(reg.test("e"));
// console.log(reg.test("f"));
// console.log(reg.test("g"));
// console.log(reg.test("h"));
// console.log(reg.test("i"));
// 判定数字和字母
// var reg = /^[0-9a-zA-Z]$/; // 含义: 检测一个字符 该字符必须是0~9a-zA-Z之间的任何一个
// console.log(reg.test("0"))
// console.log(reg.test("9"))
// console.log(reg.test("T"))
// console.log(reg.test("g"))
// console.log(reg.test("_"))
// [^] 取反 只要出现在[]之内的 都不可以
// 定义正则表达式
// var reg = /^[^a]{0,}$/; // 含义 整个字符串中不能出现a这个字符
// console.log(reg.test("ab"));
// console.log(reg.test("b"));
// console.log(reg.test("c"));
// console.log(reg.test("d"));
// console.log(reg.test("e"));
// console.log(reg.test("f"));
// . 这个元字符表示的是任意(除了回车和换行之外)
// var reg = /.+/;
// var result = reg.test("a-dsfafwe-234123125324-dfszdff^$%^&*%$")
// console.log(result);
// | 表示或者
// var arr = ["a.txt", "b.jpg", "c.html", "d.css", "e.js", "f.png", "h.gif"];
// // 定义正则 只要是以 jpg 或者 png 或者 gif 结尾的都算
// var reg = /\.(jpg|png|gif)$/;
// arr.forEach(function(value) {
// console.log(value + (reg.test(value) ? "是" : "不是") + "图片文件");
// });
字符串方法replace
- replace(drop, add);
- drop 被替换下的内容
- add 被替换上的内容
- 可以是字符串
- 可以是函数
- 函数的返回值是被替换上的内容
- 函数的参数
- 第一个表示匹配到的内容
- 第二个表示匹配到的内容的索引
- 第三个表示原字符串
- 如果正则表达式中有圆括号,则圆括号的内容会一一对应放在第二个参数位置及后面位置 原来的第二个参数和第三个参数会向后推移
简单的小例子
<script>
var str = "abcd1sdfweaoif7sdofihaoiewhfoihe65afhuafhewaiuhfi912831289";
// 规则:将所有的数字 替换成字符*
// 常规方式: for 循环 挨个使用isNaN方法判定是否是数字如果是数字 再替换
// 正则方式: 使用replace方法 第一个参数是正则表达式 第二个参数是*
// var reg = /\d/g; // 含义:一个数字 替换后的结果是将每一个数字都替换成一个*
// var reg1 = /\d+/g; // 含义:至少一个数字 替换后的结果是将多个数字替换成一个*
// 第一个参数可以替换为正则
// var str1 = str.replace(reg, "*");
// console.log(str1);
// var str2 = str.replace(reg1, "*");
// console.log(str2);
// 第二个参数可以替换为函数 它常常与正则一起使用
// 函数的返回值会作为替换上的结果 替换到正则所匹配的内容区域
// 函数的参数 如果正则表达式中没有 () 则第一个参数是匹配到的内容 第二个参数是改内容位于原字符串的下标位置 第三个参数是原字符串
// var reg = /\d+/g;
// var str1 = str.replace(reg, function(match) {
// console.log(arguments);
// return "<>";
// });
// console.log(str1);
// 带有圆括号的正则表达式
// var str = "ac.d.ghi.hjk.xxx";
// var reg = /(\.(\w+))/g;
// var reg = /(\.\w+)/g;
// str.replace(reg, function(match, $1, $2) {
// console.log(arguments);
// })
</script>
正则表达式的修饰符
<script>
// 正则表达式由两部分组成 第一部分就是之前学习过的元字符 转移字符等
// 第二部分是修饰符 也叫做标识符 g:全局匹配 i:忽略大小写 m:多行匹配
// var reg = /\d+/g; // g表示global 是全局的意思 正则表达式一旦加入它 就会进行全局匹配
</script>
正则表达式方法
<script>
// 正则表达式是引用类型 具备一些方法的 比如之前调用的test方法
// test方法 用于检测一个字符串是否符合正则表达式的规则描述 返回值是布尔值
// var reg = /a/;
// console.log(reg.test("a"));
// 以对象的形式输出正则
// console.dir(reg);
// exec方法用于对字符串进行正则检测 返回值: 如果匹配到字符串的内容 就返回数组 如果匹配不到就返回null
// var str = "www163com789";
// var reg = /\d+/; // 含义: 至少一位数字
// var arr = reg.exec(str);
// console.log(arr);
// 数组的成员就一个 就是匹配到的符合正则描述的字符串部分
// 数组有一个属性 index 表示这个成员的第一个字符在原字符串中的位置 下标
// 数组还有一个属性 input 表示原字符串
// 如果正则表达式带有g全局修饰符 那么exec方法在每一次执行时都会返回下一个匹配项的信息
// var str = "www163com789";
// var reg = /\d+/g; // 含义: 至少一位数字
// var arr = reg.exec(str);
// console.log(arr);
// var arr = reg.exec(str);
// console.log(arr);
// var arr = reg.exec(str);
// console.log(arr);
</script>