正则表达式

正则表达式
模式:正则的具体化
匹配:和字符串做比较,找出符合规则的字符串
模式匹配:找出符合规则的字符串
正则表达式,都是和字符串有关

什么是正则表达式

1.定义
正则表达式是描述查找文字主体时代匹配的一个或多个字符串
正则表达式为一个模版,将某个字符模式与搜索的字符串相匹配

2.为什么要使用它呢?
a.查找
它可以帮助我们准确,快速查找我们想要的字符串
比如你在网站中,想要查找只和css相关的选项
b.替换
比如爬虫,从比如你用爬虫从别的网站那里去来东西,但是好多网站他们字里行间会有自己网站的地址,这时候可以用正则表达式替换掉所有原有链接,变成自己的
c.数据有效性验证
好多网站注册时需要输入邮箱和密码
可以使用正则去验证输入的内容是否表达要求

3.初识正则表达式

a.字面量或者直接量
[]
{}
/js/匹配字符串中j和s

b.构造函数

new Array()
new Object
regular expression
new RegExp()
e.g.
var str =‘I love js’;
var pattern = /js/;//这里的js匹配上了,匹配上的是字符串中的js
⚠:匹配上的内容一定要是字符串中的内容
/js5_正则,;!@/只要不是特殊字符,都是普通字符,都可以使用

.让正则去匹配字符串
两种正则方法

a.test
e.g.
var str =‘I love js’;
var pattern = /js/;
console.log(pattern.test(str));
返回值是boolean
b.exec
返回数组
⚠:默认情况下正则区分大小写
模式修饰符:
i :ignoreCase
g:global
m:multiline
e.g.想让js忽略大小写
var str =‘I love js’;
var pattern =/js/i;
pattern.test(str));
这几个修饰符的顺序无所谓

构造函数例子:

var str =‘I love js’;
var pattern = new RegExp(‘js’);//可以传两个参数,后面的是修饰符

使用哪种方式创建正则表达式
自变量的规则是写死的
而构造函数是更灵活的方法
比如当我们需要看用户的输入确定正则的时候⚠

var pattern = new RegExp(userInput,’i’);
userInput可以一直变

简单的转义字符

\:将字符转义
e.g.
var str =‘//我是注释’;
var pattern = /\//;
特殊字符想要匹配他们本身的意思的话需要在前面加上转义字符
但是如果想要表达斜杠本身的话,也需要转义了
\n:换行    等于     \x0A
\t:制表符
/\u0009/:tab键

字符类

1.var pattern = /[jsaiefjkd]/;
意思是说随意匹配一个
先找到哪个,先匹配哪个,再多也只匹配一个
2./[^js]/;
除了js以外的任何字符,也是只匹配一个
3./[a-z]/;
字符串还可以传一个范围
前面的一定要比后面的小,或者等于
4./[\u4e00-\u9fa5]/;
中文字的范围
5./[a-zA-Z]/;

常用的字符类:

1/./;
除了\n以外的所有东西
2./[a-zA-Z0-9_]/;
等于/\w/
/[^a-zA-Z0-9_]==/\W/
3./\d/;
等于/[0-9]/;
4./\s/;
既能匹配空格,又能匹配制表符(tab)
5./\S/

重复

1.指定个数
var str=‘110’//如果想匹配不止一个
   var pattern = /d{3}/;//匹配三个
2.指定范围
比如我要1-2两个
var pattern=/d{1,2}/;
前面的数字要小于等于后面的
数字之间不可以空格
3.大于等于呢
var pattern=/d{1,}/;
4.{0,1}=?匹配0次或1次
5.{1,}= +
6{0,}= *
非贪婪的重复
只需要在量词后面加上?就好了
只是尽可能的少匹配但是也要满足前后条件

选择

1./html|css|js/
|:或者
从前往右
而且只匹配一个,匹配第一个相同的
分组和应用
1.var pattern = /(abc)c/;
捕获内容
每一个括号都代表了一个分组
2.不用捕获
?:
3.\1代表第一个分组
位置匹配之首尾匹配:
1./^js/;
表示j必须在开头
[^]这个是要放在字符类里的
2.尾匹配:
/js$/
例子:如何能够保证输入的都是数字呢?
/^\d+$/:从首到尾,都是数字
或者/\D/;

匹配位置:

/\b/:代表边界
比如空格就是一个边界
比如/js\b/;不会打印空格
用处:
例子:
function getByClassName(className,parentNode){
    if(document.getElementsByClassName){
        return document.getElementsByClassName
    }else{
        parentNode = parentNode || document;
        var nodeList=[];
        var allNodes = parentNode.getElementsByTayName(‘*’);
        var pattern = new RegExp(‘(^|\\s+)’ + className + ‘($|\\s+)’);
    ⚠注意在构造函数总的正则,特殊符号要加上转义符号
    for(var i =0;i

举个例子,如果他有两个class 名字,其中一个是你想要的话怎么办

但是上面的例子其实复杂了
我们换一种思路:
只要是单独的单词就ok
(‘\\b'+className+'\\b');
前瞻性匹配

1.比如如果要求后面时什么,才匹配的话
/java(?=script)/;只有后面是script在匹配java
2.如果不是的时候才匹配就改成?!
RegExp对象
1.new RegExp(‘js’);//更加灵活,可以用变量传进来
2.如果想传转义字符的话,必须要再加一个转义字符,要双重转义
3.实例方法
什么叫做实例方法?
var pattern = /js/;
var pattern = new RegExp(‘js’);
不管哪种写法,得到的都是实例
实例方法:就是实例对象上的方法
比如test,exec
var str =‘js js js’;
var pattern=/js/;
console.log(patter.exec(str));    
/js/g:全局匹配
正常情况下只看第一个,但是如果加了一个g的话
如果使用了全局匹配就不光光匹配第一个js了,能匹配所有的js
但是他还是每次都只匹配一个,只不过匹配过的不会再匹配第二次

pattern.lastIndex在不是全局匹配时都是0
但是使用全局匹配了的话,则每一次的位置都会前往下一个
一旦找不到以后(出现了第一个null)
则下一个会重置,再一次从0开始

RegExp对象的实例方法2:

var str =‘1.js 2.js 3.js’;
var pattern = /js/g;
match=‘’;
while((result=pattern.exec(str))!=null){
    total++;
    match+=‘第’+total+’个匹配到的是:’+result[0]+’它的位置是’+ result.index + ‘\n’;
}

var pattern = new RegExp(‘a\\nb’)
console.log(pattern.toString());
console.log(pattern.toLocaleString());//很类似,转换成具有本地特色的字符串
console.log(pattern.valueOf());//返回的正则它本身
RegExp对象的实例属性和构造函数属性
var str = ‘js js js’;
var pattern = /js/ig;
检查有没有写他们:
console.log(pattern.ignoreCase);//true
console.log(pattern.global);//true
console.log(pattern.multiline);//false 
console.log(pattern.source);//返回自变量形式对应的字符串
console.log(pattern.lastIndex);//打印出来的东西所处位置

构造函数属性
RegExp.属性名
属性input:待匹配的字符串,等于$_
但是必须要执行一次才有
所有可以用点能表示的,都可以用数组表示
但是不是所有用中括号表示的都可以用$表示

lastMatch:最近一次匹配到的字符
别名:$&,要写在数组里

leftContext:左边剩余字符[‘$`’]
rightContext:右边剩余字符[“$’”];
lastParen(子选项,括号里的)[“$+”]
$1是构造函数的分组,代表之前执行的括号里的值
string对象中与正则相关的方法之search,match:
1.var str = ‘html js’;
var pattern = /js/;
console.log(str.search(pattern));
返回我们匹配值的位置,如果没有的话返回-1,并且也只匹配第一个,有没有全局匹配都无所谓
里面不写pattern,写字符串也可以,但其实最后字符串也会变成正则

2.match
var str =‘js js js’;
var pattern = /js/;
console.log(str.match(pattern));//[‘js’]
匹配不到返回null

和exec不一样的地方:
当我们要求他全局匹配的时候
它一次性会全部打印出来,但是分组中的括号不会被打印
match总结:非全局的情况下,才会返回分组中匹配到的内容,全局匹配只能匹配到所有匹配的字符
exec:无论是否全局匹配都会返回分组中匹配到的内容,都只会返回当前匹配到的一个内容,而不是全部返回
m:多行匹配
m一定要和g一起使用才能看出来,还有,必须要使用首匹配或者尾匹配

3.split
var str = ‘html,css,js’;
var pattern = /\s*,\s*/;
String对象中与正则相关的方法之replace
1.字符串替换方法
var str =‘I love js js’;
cnsole.log(str.replace(‘js’,’html’));
只能替换第一个// I love html js
2.正则替换方法
var str = “I love js js’;
var pattern = /js/g;
console.log(str.replace(pattern,’html’);

var str =“1111-11-11’;
var pattern = /-/g;
console.log(str.replace(pattern,’,’);
//1111.11.11

var str = ‘I love js’;
var pattern = /(js)/;
str.replace(pattern,’$1’);
可以用document.write直接print出来

var str =‘中国军队和阿扁一起办证’;
var pattern = /国军|阿扁|办证/g;
console.log(str.replace(pattern,function($0){
    var result =‘’;
    for(var i =0;i<$0.length;i++){
        result+=‘*’;
    }
    return result;
}));

QQ号,昵称和密码

1.验证一个QQ号:
规则:全是数字,首位不能为0,最少五位,目前最多11位
/^[1-9]\d{4,}$/
2.昵称的问题
规则:中英文数字,下划线,2-18位
/^[\u4e00-\u9fa5a-zA-Z0-9_]{2,18}$/
/^[\u4e00-\u9fa5\w]{2,18}$/
3.密码的要求
规则:6-16位
    不能用空格和空白字符
    区分大小写
/^\S{6,16}$/
4.去除字符串首尾的空白字符
var str =‘       Alex’;
var pattern = /^\s+|\s+$/g;
str.replace(pattern,’’)

function trim(str){
    return str.replace(/^\s+/,””).replace(/\s+$/,’’);
}
5.转驼峰
将连字符-
css:background-red:red;
js:style.backgroundColor = ‘red’;—驼峰
jquery:$(elem).css(‘background-color’,’red’);
var str =‘background-color’;
var pattern = /-([a-z])/gi;
console.log(str.replace(pattern,function(all,letter){
    return letter.toUpperCase();
}));
function toCamelCase(str){
    return str.replace(pattern,function(all,letter){
        return letter.toUpperCase();
}));
6.匹配HTML标签
可以用来过滤标签
var str = ‘

123

”; var pattern = /<\/?[a-zA-Z]+(\s+[a-zA-Z]+=“.*”)*>/g; console.log(match(pattern)); 逆向思考的写法 var str = ‘

123

”; var pattern = /<[^>]+>/g; 但是这个有特例:var str =‘” name=“username”/>; 7.email邮箱 /(?:\w+\.)*\w+@(?:\w+\.)+[a-z]/i; 换个分组方式: /^[a-z0-9]+(?:[._-][a-z0-9]+)*@[a-z0-9]+(?:[._-][a-z0-9]+)*\.[a-z]{2,4}$/i; 8.url地址 (协议:\/\/)主机名(:端口号)/(路径) /^(https?:\/\/)?([^:\/]+)(\d)?(\/.*)?$/ 这里没有写全,实际上协议还有 ftp mailto file

总结:

1./js/igm
2.new RegExp(‘’,’’);
3.exe,match区别
4.replace,test,search,split
5.m
6.转义字符
\n :换行
\t:tab
\xnn
\uxxxx
7.字符类:
[]:任意一个都能匹配
[^]相反
. :除了换行符
8.\w \W
9.\d  \D
10.\s \S
11.+
12   *
13   ?
14.   ?非贪婪,不一定有
15.分组,选择
|匹配左边或者右边,左边匹配上了右边就不看
()分组
(?:)非捕获性分组
16.捕获到的内容如何获得
exec
/\1/
replace的第二个参数$1
RegExp:$1
17.首匹配^
尾匹配:$
\b:边界
18.前瞻性匹配
(?=p)和(?!p)
19.对象实例方法
test
exec
 toString()
toLocaleString()
valueOf()
20.String对象和正则相关的方法
search
match

你可能感兴趣的:(正则表达式,前端)