//正则:就是以个规则 用来处理字符串的一个规则
var reg =/\d/;
reg.exec("1"); //匹配符合的
//2如何创建一个正则
//字面量方式:
var reg = /\d/;
//实例创建方式:
var reg = new RegExp("");
//元字符
每一个正则表达式都是由元字符和修饰符组成的
元字符在 // 之前具有意义的一些字符
\: 转义 字符, 转义后面字符所代表的含义
^: 某一个元字符开始
$:某一个元字符结尾
//代表出现次数的量词元字符
*:出现零到多次
+:出现1到多次
?:出现零次 或者一次
{n}: 出现n次
{n,}: 出现n到多次
{n,m}: 出现 n到 m次
\n :匹配一个换行符
. : 除了\n以外的任意字符
一个简单的验证手机号的正则:11位数字,第一位是1
var reg = /^1\d{10}$/
():分组 - >把一个大正则本身划分成几个小的正则
1)改变默认的优先级
var reg = /^18 |19$/ //189 119 19
var reg = /^(18 |19)$/ //18 19
2)
var reg = /^(\d+)abc(\d+)$/
x|y: x 或者y中的一个
[xyz] : x或则y或则z中的一个
[^xyz]: 除了三个以外的任何一个字符
[a-z]:a-z中间的任意一个字符
[^a-z]:除了a-z中的任意一个字符
\d: 一个0-9之间的数字 \D:除了0-9之间的以外的任何字符
\b:一个边界符
\w:数字 字母 下划线中的任意一个字符[0-9a-zA-Z_]
\s :匹配一个空白字符 空格 一个制表符 换页符
g (global) 全局匹配(会查找所有匹配,不会在查找到第一个匹配时就停止)改变了lastIdex的值到最新
i (ignoreCase) 执行对大小写不敏感的匹配
m (multiline) 执行多行匹配
在中括号[ ] 出现的所有字符都是代表本身意思的字符 没有特殊含义
1) 有效数字的正则
"."可以出现也可以不出现,但是一旦出现,后面必须跟着一位或者多为数字 .
也就是说”[]”代表的是一个字符集,”^”只有在字符集中才是反向字符集的意思
[] 中括号中不识别两位数 var reg = /^[12]$/; 1 or 2
var reg = /^[12-68]$/ 1, 2-6中的一个, 8 三个中的一个
字面量方式和实例创建的方式在正则中的区别?
1.字面量方式中出现的一切都是元字符,所以不能进行变量值的拼接,而实例方式可以
2.字面量方式中直接写\d就可以, 而在实例中需要把它转义\\d
age between 18~65 : var reg = /^(1[8-9] | [2-5]\d | 6[0-5])$/
verify email : var reg = /^[\w.-]+@[0-9a-zA-Z]+(\.[a-zA-z]{2,4}){1,2}$/;
中国标准真是姓名 2-4位汉字 : var reg = /^[\u4e00 - \u9fa5]{2,4}$/i
身份证号码 : var reg = /^\d{17} (X| \d)$/ (根据身份证号码提取信息)
正则的捕获 var reg = /^(\d{2})(\d{4})$/
reg.exec ->正则的捕获
1.捕获到得内容是一个数组
【捕获的字符 ,index:开始位置, input 原始字符】
2. 正则的懒惰性
捕获第一个匹配的
lastindex 是正则每一次捕获在的位置,默认值是0
var ary=[];
var res = reg.exec(str);
while(res){
ary.push(res[0]);
res = reg.exec(str);
}
3.正则的贪婪性
我们默认捕获 符合最长的字符串
在量词后面加一个?
?的不同作用
放在一个普通的元字符后面代表出现0-1次 /\d?/
房子啊一个量词的元字符后面是取消捕获贪婪性/\d+?/
字符串中的match
var ary = str.match(reg);
match一次性捕获所有成一个数组 match虽然比exec简单,但是在分组捕获的情况下,match只能匹配到大正则的, 捕获不到小正则.
正则的分组:
var reg = /^(\d{2})(\d{4})(\d{4})(?:\d{2})(\d{2})(\d{2})$/
1.改变优先级
2.分组引用 var = /^(\w)\1(\w)\2$/ \1和第一个正则一模一样 \2和第二个正则一模一样
(?:)在分组中的意思是只匹配不捕获
replace:把原有的字符替换成新的字符
在不使用正则的情况下,每当执行一次只能替换一个字符
str = str.replace(/zhufeng/g,"zhufengpeixun")
str = str.replace (/zhufeng/g, function(){
console.log(arguments[0]); // 每一次执行匿名函数捕获到的内容
return "zhufengpeixun" //返回的内容把每次大正则匹配捕获的内容都替换了
})
匿名函数的arguments 和 exec得到的数组是非常类似的,也同样可以得到分组的正则的内容
arguments[1] 获取每一次执行匿名函数我们正则捕获的第一个分组中的内容
RegExp.$1 获取第一个分组捕获的内容
正则的捕获: 正则的exec方法,字符串的match方法,字符串的replace方法
arguments[0] --> exec 捕获的组的第一项
arguments[1] --> exec捕获数组的index
arguments[2] --> exec捕获组的input内容
//queryURLParameter
var str = "http://kbs.sports.qq.com/kbsweb/game.htm?mid=10000&cid=1467086&app=1.0";
var reg=/([^?&=]+)=([^?&=]+)/g;
var obj={};
// var res = reg.exec(str);
// while(res){
// obj[res[1]] = res[2];
// res = reg.exec(str);
// }
str.replace(reg,function(){
obj[arguments[1]] =arguments[2];
});
console.log(obj);
cookie = "id=123; username=yang; id=123; sex=1"
//如果现在要获取id,正则表达式怎么写?
//value值的表示方法 ([^;]*) 除了分号之外的任意字符重复任意次数
//结尾符号的判断(;|$)
var cookie = "id=123; username=yang; sex=1";
var reg4 = /(^| )id=([^;]*)(;|$)/;//匹配某个cookie的正则
var arr = cookie.match(reg4);//match方法发挥数组
console.log(arr[2]);
//获取usernama对应的值
var reg5 = /(^| )username=([^;]*)(;|$)/;//获取username的值
var arr2 = cookie.match(reg5);
console.log(arr2);//如果match方法没有找到就会返回null [" username=yang;", " ", "yang", ";", index: 7, input: "id=123; username=yang; sex=1"]
console.log(arr2[2]);//数组中的第二个是就是 第二个分组对应的值
//获取某个cookie对应的cookie
function getCookie(key) {
var str = "(^| )" + key + "=([^;])(;|$)";//[,,,]
var reg = new RegExp(str);
if (!arr)//arr数组为null match没有在字符串中找到该cookie
{
return null;
}
return arr[2];//只需要数组中索引为2的值
}
document.cookie = "username=yang;";
document.cookie = "id=123";
alert(getCookie("color"));
alert(getCookie("username"));