JavaScript最初诞生的目的是什么?
- 从杂乱字符串中找出数字:
var str='dadf12,3dsafd44dfds-qwwe=567#[]88dg;999'
var arr1 = []
for(var i = 0; i < str.length; i++){
if(str.charAt(i) >= 0 && str.charAt(i) <= 9){
arr1.push(str.charAt(i))
}
}
console.log( arr1.join('') ) // '1234456788999'
- 懒人推动科技进步:
var str='dadf12,3dsafd44dfds-qwwe=567#[]88dg;999'
var arr1 = str.match(/\d+/g)
console.log( arr1.join('') ) // '1234456788999'
正则表达式
正则表达式,又称规则表达式
正则表达式是对字符串操作的一种逻辑公式
,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个规则字符串
,这个规则字符串用来表达对字符串的一种过滤逻辑
正则表达式通常用来检索、替换那些符合某个规则的字符串
定义正则表达式
- 构造函数方式:
new RegExp(pattern, attributes)
- 参数 pattern(规则) 可以是常量字符串或一个JS变量
- 参数 attributes 为可选字符串,包含属性g、i 和 m
- g:代表全局匹配 (继续往下匹配)
- i:代表不区分大小写匹配
- m:代表多行匹配(针对^和$模式)
- var reg1 = new RegExp(‘常量字符串’,‘g’)
- var reg2 = new RegExp(JS变量,‘g’)
- 普通方式:
/pattern/attributes
- 普通方式中的pattern(规则)是一个常量字符串,不能是JS变量
- var reg1 = /常量字符串/g
- var reg2 = /abc/g
正则的索引
每个正则表达式都有一个 lastIndex 属性,用于记录上一次匹配结束的位置(索引值)
正则的实例属性 lastIndex, 初始情况下都是从零开始, 当第二次调用这个实例匹配字符串时是从上一次匹配完成位置的下一个位置开始。( 当然正则实例是开启全局的)
-
如果上次匹配到了一个位置大于等于此次匹配的字符串的长度, 那么此次匹配返回false或空数组
-
如果上次没有匹配到, 那么此次匹配还是从零开始
- 获取:reg.lastIndex
- 设置:reg.lastIndex = 0
// 示例:test方法检索字符串中指定的值 返回 true 或 false
var str = 'abcdeabfg'
var reg = new RegExp('ab','g') // 全局匹配
console.log( reg.test(str) ) // true
console.log( reg.lastIndex ) // 2
console.log( reg.test(str) ) // true
console.log( reg.lastIndex ) // 7
console.log( reg.test(str) ) // false
console.log( reg.lastIndex ) // 0
console.log( reg.test(str) ) // true
var str = 'abcdeabfg'
var reg = new RegExp('ab') // 非全局匹配
console.log( reg.test(str) ) // true
console.log( reg.lastIndex ) // 0
console.log( reg.test(str) ) // true
console.log( reg.lastIndex ) // 0
元字符
\d : 匹配一个数字,0~9 中的任意一个
\s : 匹配一个空白字符
\b : 匹配一个单词边界,不匹配任何字符
\w : 匹配一个字符( 字母、 数字、下划线 )
. : 匹配任意一个字符,除了换行符( \n )
\n : 匹配换行符
\u : 通常用来匹配汉字 \u4e4e
-
元字符 \d,\s,\b,\w 对应的大写字母表示相反的含义
-
如:\D 匹配一个非数字字符
-
如:\S 匹配一个非空白字符
// 元字符
var str = '123aBc456def ';
// \d 匹配0-9之间的数字
var reg1 = /\d/;
console.log(reg1.test(str)); //true
// \s 匹配空格字符
var reg2 = /\s/;
console.log(reg2.test(str)); //true
// \b 匹配单词边界
var str2 = 'howare you';
var reg3 = /\bhow\b/;
console.log(reg3.test(str2)); //false
// \w 匹配字母、数字、下划线中的一个字符串
var str3 = '哈喽 LOL'
var reg4 = /\w/;
console.log(reg4.test(str3)); //true
// · 匹配任意一个字符
// 通常匹配一个汉字
var str4 = '23456saf一45678';
// var reg5 = /你/;//具体匹配一个汉字
var reg5 = /[\u4e00-\u9fa5]/; //匹配一个汉字
console.log(reg5.test(str4)); //true
// \n 匹配一个换行符
var reg6 = /\n/;
console.log(reg6.test(str)); //false
方括号
[abc] : 匹配方括号之间的字符
[^abc] : 匹配不在方括号之间的字符(反选)
[0-9] : 匹配从 0 到 9 的数字 \d
[a-z] : 匹配从小写 a 到小写 z 的字符
[A-Z] : 匹配从大写 A 到大写 Z的字符
// 方括号:元字符的补充,也是匹配一个字符
var str = 'gafd876532sadf';
var reg1 = /[13579]/; //匹配方括号中任意一个数字
var reg2 = /[sdf]/; //匹配方括号当中任意一个字符
var reg3 = /[0-9]/; //匹配0-9当中任意一个数字
var reg4 = /[a-z]/; //匹配a-z当中任意一个小写字符
var reg5 = /[A-Z]/; //匹配A-Z当中任意一个大写字符
var reg6 = /[0-9a-zA-Z]/; //匹配任意一个数字或字母
var reg7 = /[^abc]/; //匹配除了abc之外的任意一个字符
console.log(reg1.test(str)); //true
console.log(reg2.test(str)); //true
console.log(reg3.test(str)); //true
console.log(reg4.test(str)); //true
console.log(reg5.test(str)); //false
console.log(reg6.test(str)); //true
console.log(reg7.test(str)); //true
量词
n+ : 匹配包含至少一个 n 的字符串 {1,}
n? : 匹配包含零个或一个 n 的字符串 {0,1}
n* : 匹配包含零个或多个 n 的字符串 {0,}
n{X} : 匹配包含 X 个 n 的字符串
n{X,Y} : 匹配包含 X 到Y 个 n 的字符串
// 量词:表示匹配的字符个数
var str = 'aa1234abc66yu8aaaa98';
var reg1 = /a+/g; // 匹配一个或多个a + === {1,}
console.log(str.match(reg1)); //['aa', 'a', 'aaaa']
var reg2 = /w*/g; // 匹配0个或多个w * === {0,}
console.log(reg2.test(str)); //true
var reg3 = /x?/g; // 匹配0个或1个x ? === {0,1}
console.log(reg3.test(str)); //true
var reg4 = /\d{2,4}/g; // 匹配2个到4个数字
var reg5 = /\d{2,}/g; // 匹配2个或2个以上多个数字
var reg6 = /\d{2}/g; // 匹配2个数字
console.log(str.match(reg4)); // ['1234', '66', '98']
console.log(str.match(reg5)); // ['1234', '66', '98']
console.log(str.match(reg6)); // ['12', '34', '66', '98']
其他
^n : 匹配开头为 n 的字符串
n$ : 匹配结尾为 n 的字符串
| : 匹配左边或者右边
\ : 转义符
特殊标点符号,在前面加 \ 转义后,就代表该符号本身,如:
- 要匹配 “^” 字符本身,请使用 ^
- 要匹配小括号()本身,请使用 ( 和 )
- 需要转义的特殊符号:( ) [ ] { } . ? + * | \ $ ^
Unicode编码16进制的utf-8汉字编码:
- /[\u4e00-\u9fa5]+/ 常用汉字编码范围
- 4e00最小中文字符,9fa5最大中文字符
var str = '123jlkj在乎637skfjkdd'
var reg1 = /[\u4e00-\u9fa5]+/g // 匹配一个或多个汉字
var reg2 = /\u4e4e+/g // 匹配一个或多个'乎'
console.log( reg1.test(str) ) // true
console.log( reg2.test(str) ) // true
Unicode编码汉字对照表:http://www.chi2ko.com/tool/CJK.htm
分组
定义字符串规则时,可以使用小括号将匹配内容进行分组
- RegExp对象会在正则匹配后,自动将最近一次结果保存起来
- RegExp对象有$1、$2、$3 …等属性,值为正则匹配到的子串
- RegExp.$1 返回第一个分组匹配的内容(以括号为标志)
var reg = /^(\d{4})-(\d{1,2})-(\d{1,2})$/; // 小括号分组
reg.exec('2019-10-8')
console.log(RegExp.$1) // 2019
console.log(RegExp.$2) // 10
console.log(RegExp.$3) // 8
正则对象方法
test 方法检索字符串中指定的值 返回 true 或 false
- reg.test(str)
exec 方法检索字符串返回查找结果的一个数组,未匹配返回null
- reg.exec(str)
compile 方法可以重编辑指定的正则表达式
- var reg=/13[4-9]\d{8}/g
- reg.compile(‘13[0-3][0-9]{8}’,‘g’) //修改正则
String对象方法
search 方法返回正则匹配的值的索引,没有匹配返回-1
- str.search(reg)
match 方法返回所有正则匹配的值(数组),加g全局匹配模式
- str.match(reg)
replace 方法替换与正则匹配的子串,返回替换之后的内容
- str.replace(reg,‘**’)
split 方法将字符串匹配的部分做分割(去除),返回数组
- var str = ‘123=asd=232=asda=57787’
- console.log( str.split(‘=’) )
- var str = ‘123+asd=232-asda*57787’
- console.log( str.split(/+|=|-|*/g) )
一些匹配规则
过滤HTML标签
尖括号里是除了尖括号之外其他字符
var reg = /<[^<>]+>/g
匹配邮政编码
开头非0的6位数字
var reg = /^[1-9]\d{5}$/
文件格式检测
文件格式结尾为 .格式
var reg = /\.(png|jpe?g|gif)$/
var reg = /\.(mp4|webm|ogg|mp3|wav)$/
手机号
var reg = /^(1|\+861)[3-8]{1}\d{9}$/
身份证
身份证号码为15位或者18位,15位为全数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
var reg = /(^\d{15}$)|(^\d{17}(\d|X|x)$)/
中文检测
var reg = /[\u4e00-\u9fa5]+/g
QQ号验证
var reg = /^[1-9]\d{4,10}$/
座机号码
010-86123456-2345
023-67622000-02
0755-66608483
开头为0,后面是2或三位数字加上 - 开头为非零的八位数字,结尾是 - 加1到4位数字的分机号
var reg = (0\d{2,3}-)?[1-9]\d{7,8}(-\d{1,4})?
邮箱格式
简单验证 var reg = /^\w+@[a-z0-9]+\.[a-z]+$/
具体验证 var reg = /^\w{2,18}@[0-9a-z]{1,10}(\.[a-z]{2,3}){1,2}$/
删除多余空格
var reg = str.replace(/\s+/,'');
删除首尾空格
var reg = str.replace(/^\s+/,'');
var reg = str.replace(/\s+$/,'');