正则运用
正则表达式在web开辟中的经常运用
邮箱考证
用户名考证
替代字符串某一部份
信息收集,用来剖析有用代码段
…
有规律的字符串形貌
正则表达式是一门自力的学问,一样的一段形貌,比方,关于email的婚配表达式,在差别的言语是一样的,然则挪用的函数差别。
正则表达式–划定规矩表达式
正则表达式:正则表达式
正则表达式语法:正则表达式语法
正则表达式言语:正则表达式言语
预备性的事情
在js中,怎样写正则表达式。 /RegExp/
在js里,用正则表达式来考证字符串是不是满足, 运用 reg.test(str);
用正则表达式的exec函数,用来查找婚配的选项,并把查找的值掏出。
reg.test(str); 返回true 或许false 。 常在表单考证中运用。
<from action="xxx.php" id="biaodan">
<p>请输入姓名:<input type="text" id="name" /></p>
<p>请输入岁数:<input type="text" id="age" /></p>
<p><input type="submit" /></p>
</from>
<script>
var oBD = document.getElementById('biaodan');
var oName = document.getElementById('name');
var oAge = document.getElementById('age');
//表单试图提交的时刻,触发onsubmit事宜
//这个函数返回了false,表单不会被提交
oBD.onclick = function(){
//考证name
if( !/^[\u4e00-\u9fa5]{2,4}$/.test(oName.value) ) return false;
//考证岁数
if( !/^\d{2,3}$/.test(oAge.value) ) return false;
if( parseInt( oAge.value )<10 || parseInt( oAge.value )>104 ) alert('您输入的岁数不在局限') return
false;
return true;
}
</script>
exec(); 返回 数组 或 null。
exec是英语execute的意义,CEO首席实行官,E就是executive实行的
“实行” 把正则式放到字符串上实行
每次实行效果顺次输出,不论效果有几个,一次只输出一个 ,假如屡次输出,会坚持前面的援用。当婚配凌驾原字符串的时刻,会返回null。然后遇到null,指针返回到婚配的字符的第一位。 具有迭代器的觉得。
var str = 'ABCDEFG1234567abcdefg';
var reg = /[a-z]/g;
console.log( a=/[a-z]/g.exec(str) );
var a;
while( a=reg.exec(str) ){ //这边 null 为 fasle。 exec() 会坚持对前面一次的援用。 须要运用 值来赋值。
console.log( a );
}
运用exec() 找最大子串
var str = 'AAABBBCCCCCCC';
var reg = /(\w)\1+/g;
var maxLength = 0;
var maxLetter = '';
var a;
while( a=reg.exec(str) ){
if( a[0].length>maxLength ){
maxLength = a[0].length;
maxLetter = a[0];
}
}
console.log( maxLetter );
var str='BCDEFG1234567abcdefg';
var reg = /[a-z]/g;
var a;
while( (a=reg.exec(str)) != null ){ //先赋值给a,然后再与后边推断。
console.log( a );
}
str.match( reg ); //查找,婚配到,返回数组
str.split( reg ); //拆分,返回数组
str.serch( reg ); //查找位置
str.replace( reg,’new str’); //正则替代,返回string
//测试是不是含有hi
var reg = /hi/; //仅看字符串是不是有 hi
console.log( reg.test('hello') ); //fasle
console.log( reg.test('this is iqianduan') ); //true
//测试单词 hi
var reg01 = /\bhi\b/;
console.log( reg01.test('this is') ); //false
console.log( reg01.test('this is, hi,his') );//true
正则表达式 3 句话
要找什么字符?
从哪儿找?
找几个?
要找什么字符
字面值, ‘hi’ ,就是找‘hi’。
用字符的鸠合来示意 , [abcd], 指婚配abcd中恣意一个
//找不吉祥的数字
//3,4,7
var reg = /[3,4,7]/; //字符鸠合, 不能运用 /347/ 字面值示意,是示意团体。
console.log( reg.test('12121212') );//false
console.log( reg.test('12341234') ); //true
用局限示意字符 , [0-9] [0123456789] [a-z] [A-Z]
// var reg = /[0123456789]/;
var reg = /[0-9]/;
console.log( reg.test('123afsdf') ); //true
console.log( reg.test('asdf') ); //false
//是不是有大写字母
var reg = /[A-Z]/;
console.log( reg.test('asdf') );//false
console.log( reg.test('Tomorrow is another day') ); //true
字符簇, 五彩缤纷-> 一坨字符。
体系为经常运用的字符鸠合,建立的简写.
比方:
[0-9]
–>\d
[0-9a-zA-Z_]
–>\w
.. 域名,注册用户名经常运用的情势.[\t\v\f\r\n]
–>\s
空缺符.
//是不是含有数字
var reg = /\d/;
console.log( reg.test('123afsdf') ); //true
console.log( reg.test('asdf') ); //false
补集的情势来示意字符鸠合 在鸠合前面运用示意补集。
[0-9]
—>[^0-9]
^ 脱字标记: 念法: caret。[‘kærət] 。[abcdef]
–>[^abcdef]
//考证全为数字
var reg = /^[0-9]/; //婚配非数字
// var reg = /^d/ //字符簇补集
console.log( reg.test(‘aaaaa’) );//非数字存在 false
console.log( reg.test(‘123aaa’) ); //有数字存在 true
字符簇的补集:
d — > D(非数字)
s –> S(非空缺字符)
w –> W
恣意字符 : . 惟独不包括换行符
从哪儿找,找到哪儿
b 单词边境
/bhi/ –> 从单词的边境最先婚配hi。
// 婚配单词hi,包括hi自身
// var reg = /\bhi.+/;//毛病
// var reg = /\bhi\w+/; //毛病。 + --> 起码有 一个
var reg = /\bhi\w*/;
console.log( reg.exec('this is') ); //null
console.log( reg.exec('his') ); //["his", index: 0, input: "his"]
console.log( reg.exec('history') ); //["history", index: 0, input: "history,hi"]
//婚配进行时的末端
var reg = /\b[a-zA-Z]+ing\b/;
console.log( reg.exec('going') );//["going", index: 0, input: "going"]
console.log( reg.exec('1ting.com') );//null
console.log( reg.exec('ing') );//null //2 -> to 4->for 0->zero
//婚配un前缀的反义词
//unhappy happy,hungry,sun,unhappy
var reg = /\bun[\w]+\b/;
console.log( reg.exec('happy,hungry,sun,unhappy') ); //["unhappy", index: 17, input: "happy,hungry,sun
,unhappy"]
B 单词的非边境
// 把单词中心的某一个部份掏出来。
// 把中心含有hi的单词掏出,即hi不能在两头。
var reg = /\Bhi\B/;
console.log( reg.exec('this') ); //["hi", index: 1, input: "this"]
console.log( reg.exec('hi') ); //null
^ creat , 从字符串的肇端位置最先婚配
$ 婚配到字符串的完毕位置
从字符串的开首到末端最先婚配,模仿运转递次.
var reg = /^lishi$/;
console.log( reg.exec('lishinihao') ); null
console.log( reg.exec('lishi') ); //["lisi", index: 0, input: "lisi"]
找若干
*
, [0,n] –> {0, }+
, [1,n] –>{1, }
? , [0,1] –>{0,1}
n {n} {3} a{n} , 字符a正确的涌现n次
a{n,} 字符a,起码涌现n次。
a{n,m} 字符串a,涌现n到m次。
情势
以婚配为例,默许情况下,找到一次效果相符就完毕。
示知婚配历程,一向找,在全文局限内一向找。
g -> 全局情势, global 找一切的,而不是找一次就完毕
i -> 疏忽大小写,ignore
//查找一切中心含有hi的单词
var reg = /\Bhi\B/gi;
var str = 'shit,hi,this,thit,THIS';
console.log( str.match(reg) ); //["hi", "hi", "hi", "HI"]
肯定边境是什么,那些东西必须有,那些东西可以有可以没有。合营+,*
//把链接换成 #
//<a href="http://www.baidu.com"></a> --> <a href="#"></a>
//1,不能保存链接的笔墨(反向援用)
//2,不能跨行(贪欲情势)
var reg = /<a[\s]+.*<\/a>/g;
var str = '<a href="http://www.baidu.com"></a>';
console.log( str.replace(reg,'<a href="#">笔墨</a>') );
js不支持单行情势。
//s 单行情势:把悉数字符串算作一行
. 代表恣意,但不包括换行。
在js里,不支持当行情势的情况下,怎样换行?
什么样的情势能代表“一切” 字符串
sS 悉数字符 运用一个技能, 一个鸠合加补集,就是全集
[dD] [sS] [wW]
var reg = /\<a[\s][\s\S]+<\/a>/g;
var str = '<a href="http://www.baidu.com">'+
'</a>';
console.log( str.replace(reg,'<a href="#">笔墨</a>') );
//s 多行情势:遇到一行就把当前的当做一个字符串来剖析
//把每一行的末端的数字换成 #
//车牌号
//Cx003
//A0008
//B3456
var str = 'Cx003'+
'A0008'+
'B3456';
var reg = /\d+$/gm;
console.log( str.replace(reg,'#') );
贪欲情势
假如’?’紧跟在在任何量词*, + , ?,或许是{}的背面,将会使量词变成非贪欲情势(婚配起码的次数),和默许的贪欲情势(婚配最多的次数)恰好相反。
比方,运用/d+/非全局的婚配“123abc”将会返回“123”,假如运用/d+?/,那末就只会婚配到“1”。
当正则表达式中包括能接收反复的限定符时,平常的行动是(在使悉数表达式能获得婚配的前提下)婚配只管多的字符。以这个表达式为例:a.b,它将会婚配最长的以a最先,以b完毕的字符串。假如用它来搜刮aabab的话,它会婚配悉数字符串aabab。这被称为贪欲婚配。
任何量词背面 跟 ? 代表非贪欲情势 , 满足前提就不找了,小富即安,打完收工。 润饰个数,只管少找和多找的。
//goooooooooods --> goods
var str = 'goooooooooods,goooods,goooood,gooooo,gooooods';
var reg = /g[o]{3,}?ds/g;
console.log( str.replace(reg,'goods') ); //goods,goods,goooood,gooooo,goods
欲查
正向欲查
欲查不斲丧字符。
//查找进行时的单词的词根, 即 不要ing 。 going -> go
var str = 'going,comming,fly';
// var reg = /\b[a-zA-Z]+ing\b/g;
var reg = /\b[\w]+(?=ing)\b/g; // 相似探照灯,先去推断几位是不是满足,满足返回,不满足继承下一位.
console.log( str.match(reg) );
满足 ing ,找到com。
不满足接着走。 瞥见不满足前提,并不会一次性调到ing背面接下去寻觅,而是从该处光标继承寻觅。
已查找的词是斲丧了,下次从该处光标最先寻觅。
//查找进行时的单词的词根, 即 不要ing 。 going -> go
var str = 'going,comming,fly';
// var reg = /\b[a-zA-Z]+ing\b/g;
// var reg = /\b[a-zA-Z]+(?=ing)\b/g; //末端\b 是毛病的, 欲查不斲丧字符, 相当于/\b[a-zA-Z]+\b/ 这类情势
var reg = /\b[a-zA-Z]+(?=ing)/g; // 相似探照灯,先去推断几位是不是满足,满足返回,不满足继承下一位.
console.log( str.match(reg) ); // ["go", "comm"]
负向欲查
不是谁才行。 今后看肯定位数,不是谁才可以。 不要背面是某某某的东西。
//查找win98,win95,win32,win2003,winxp -->win98,win32,win2003,winxp
var str = 'win98,win95,win32,win2003,winxp';
var reg = /\bwin(?!95)/g;
console.log( str.match(reg) ); // ["win", "win", "win", "win"]
js不支持,向前正向欲查,向前负向欲查:
//找出 un系列单词的词根
var reg = /[\w]+(?<=un)/g;
var str = 'unhappy';
console.log(str.match(reg)); //报错
var reg = /[\w]+(?<!=un)/g; //向前负向欲查
反向援用
反向援用,也叫后向援用。或许分组或子表达式
平常是悉数表达式, 然则中心的部份 有特别做了形貌。 须要的部份特别处置惩罚。运用分组,叫做子表达式。
//把链接换成空衔接,坚持笔墨信息。
var str = '<a href="http://www.baidu.com">阴天快活</a>';
var reg = /<a[\s]+[^>]+>([^<>]+)<\/a>/; //超链接的表达式
console.log( reg.exec(str) ); //["<a href="http://www.baidu.com">阴天快活</a>", "阴天快活", index: 0
, input: "<a href="http://www.baidu.com">阴天快活</a>"] //可以把子表达式的东西婚配出来。
// console.log( str.replacte(reg,'#') );
/**
<a[\s]+[^>]>([^<>]+)<\/a> 重要目标是想要中心那一块
除了>以外的都可行 , 取> 的补集 [^>]
中心部份纯笔墨,不含大于号,和小于号。 取小于号和大于号的补集 [^<>]+ / [\s\S]+
*/
//平常是悉数表达式, 然则中心的部份 有特别做了形貌。 须要的部份特别处置惩罚。运用分组,叫做子表达式。
//婚配html
// /<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/
/*exec为例:
婚配到的数组,第0个单位,代表"悉数正则表达式的婚配效果"
1,2,3,4....N,则代表第N个子表达式婚配的效果。 //js顶多有9个子表达式。 // ["<a href="http://www.baidu
.com">阴天快活</a>", "阴天快活", index: 0, input: "<a href="http://www.baidu.com">阴天快活</a>"]
*/
console.log( str.replace(reg,'<a href="#">$1</a>') ); //<a href="#">阴天快活</a>
var str = '<html></html>';
var reg = /<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/;
console.log( reg.exec(str) );
str.replace(reg,function( $1,$2 ){
console.dirxml($2); //html
});
怎样援用子表达式所婚配的效果?
在正则外边运用:$N 来婚配 第N个子表达式的婚配效果。
在正则里边运用N来 运用第N个子表达式。