全面了解JS中的正则表达式
正则:就是操作字符串
1. 字符串操作
str.split(); //分割
str.toLowerCase(); //转小写
str.toUpperCase(); //转大写
str.charAt();//下标
str.subString(1,2);//截取字符串(包含起始,不包含结束)
str.indexOf();//查找下标
str.lastIndexOf(); //从后面往前找
str.charCodeAt();//转unicode
string.fromCharCode();//将Unicode转为字符
str.replace();
str.slice() //跟substring类似
2. 数组操作
arr.splice(起始位置,n);//起始位置开始(从0开算),删除n个
arr.slice(起始位置,结束位置);//起始位置开始“截取(不是删除)”,m-n个,不影响数组本身
例:var arr1 = [1,2,3,4,5];
arr1.splice(1,2);//23 arr1.splice(2,2);//34
alert(arr1);//145 alert(arr1);//125
var arr2 = [1,2,3,4,5];
arr2.slice(1,2);//2 一个 alert(arr2.slice(2,2));//空
alert(arr2);//12345 alert(arr2);//12345
3. 正则
正则:
1.方便
2.性能极高
什么是正则:正则就是一套规则
全称:正则表达式(规则表达式)
创建:
var reg=new RegExp(); regular expression :正则表达式
new RegExp('表达式','选项');
str.search(正则); 查找,只找第一次出现的位置,返回出现的位置
JS风格:new RegExp('','');
Perl风格:/a/i;
match:匹配
str.match();//
匹配出来的是一个数组,找不到返回null
把符合的全部提取出来
str.replace(正则,添加的对象);
js或者||
正则的或者 |
选项:
i:ignore 忽略大小写
g:global 全局
m:mutil-line 多行
选项不区分先后。
^行首 => ^不配合m,代表整个字符串的开头
=> ^配合m,会识别字符串换行
$行尾 =>
方括号:
1.[q,a,s] 代表 q|a|s
2./q[acd]c/ 代表qac | qcc | qdc
3.r[d,f] rd rf
4.\d [0,1,2,3,4,5,6,7,8,9]
5. "-"代表一个区间 [0-9]
6.[^0-9] ^排除 非数字
[^a-z] 非字母
量词:
/\d\d\d\d\d/
{n} 正好n个 /\d{5}/
{n,m}最少n个,最多m个
/\d{1,4}/
{n,}最少n个,多了不限
/\d{n,-10}/ 错误写法
{,m} 最少不限,最多m个 不能这么写
{0,1}可有可无
简写:
+ {1,} 若干
* {0,}可以没有,有了不限
? {0,1} 可有可无
/ab+/ 是abbbbbbbbbbbb
/(ab)+/ 匹配的是ababab
()正则里面叫:分组
/abc[0-9]{1,4}/
abc1
abc11
abc111111 错了
转译:\
\d digital 数字 [0-9]
\w word 单词
代表区间:[a-z0-9_]->字母、数字或者_
\s space 空白
\D 非数字 [^0-9]
\W 非单词 [^a-z0-9_]
\S 非空白
. 任意东西
\. 点本身(x想要.)
\\ \本身
\\\\ \\本身
\n 换行
/./ 任意一个
/.+/ 任意多个
/.*/ 可有可无
reg.test(str)
如果符合返回true,否则返回false
只要其中有一部分符合就返回true,否则返回false
例1:校验座机号
010-88688866
0416-1234567
88688866(不加区号也可以)
区号:(0[1-9]\d{1,2}-)?
号码:[1-9]\d{6,7}
/^(0[1-9]\d{1,2}-)?[1-9]\d{6,7}$/
例2:校验邮箱:
abc@163.com
10000@qq.com
zl@datura.com
用户名:\w+
\w+ @ [a-z0-9]+ (.[a-z]{2,8}){1,2}
\w+@[a-z0-9]+(.[a-z]{2,8}){1,2}
例3:校验中文
/[\u4e00-\u9fa5]{2,8}/
例4:校验手机号
移动号码:134 135 136 137 138 139 147 150 151 152 157 158 159 178 182 183 184 187 188
联通号码:130 131 132 145 155 156 171 175 176 185 186
电信号码:133 149 153 173 177 180 181 189
/^0?(13[0-9]|15[012356789]|18[0-9]|14[579]|17[135678])[0-9]{8}$/
例5:校验身份证号
公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
出生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。
下面是正则表达式:
出生日期1800-2099 (18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])
身份证正则表达式/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i
位校验规则 6位地址编码+6位出生日期+3位顺序号
位校验规则 6位地址编码+8位出生日期+3位顺序号+1位校验位
4. 补充
编码:encodeURIComponent(str)
解码:decodeURIComponent(str)