正则表达式基础入门

概述

正则表达式是一种被用于匹配字符串的字符匹配模式。多用于表单验证。正则表达式:regular expression,简称RegExp。javascript

建立正则表达式最简单的方式使用正则字面量。

字面量:用两个/作界定符。通常会将字面量赋值给一个变量。java

var pattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;git

正则表达式可使用一些字符串方法或正则方法进行操做:正则表达式

字符串的方法:express

  • split()根据匹配字符串切割父字符串,返回子串组成的数组。
  • match()使用正则表达式与字符串相比较,返回一个包含匹配结果的数组。
  • search()对正则表达式或指定字符串进行搜索,返回第一个出现的匹配项的下标。
  • replace()用正则表达式和字符串直接比较,而后用新的子串来替换被匹配的子串,返回新的匹配以后的字符串。

正则表达式方法:数组

  • exec()在目标字符串中执行一次正则匹配操做,返回的是第一次匹配的子串的数组。
  • test()测试当前正则是否能匹配目标字符串,返回true或false。

不一样的数据类型又本身的方法和属性,使用时必须调用正确,下面分别介绍几种方法的使用。

字符串方法

  • plit()根据匹配字符串切割原字符串。split方法传递的参数是分隔符,能够是str或者reg,找到分隔符以后就从str中删除,返回子串数组。

若是没有找到分隔符,那么返回的数组包含的是一整个str组成元素的数组。若是分隔符为空字符串“”,返回的是字符串每一个字符组成元素的数组。 返回值:由切割后的子字符串组成数组。能够用来将用户输入的不规范的字符串转为正确的Array。bash

例:根据空格切割字符串:'aa bbb c dd eeeeee'函数

'aa bbb c dd eeeeee'.split(/\s+/);   //["aa","bbb","c","dd","eeeeee"]
复制代码

\s:表示空白字符;测试

+:表示前面的一个符号表明的字符能够出现一次或者屡次ui

  • earch()对正则表达式或指定字符串进行搜索,传入的参数是字符串或者reg,返回第一个出现的匹配项的下标(相似indexOf)。

返回值:子串或正则匹配结果在父字符串中的第一次出现的位置的下标。search搜索只找到第一次搜索到的位置下标,因此全局标志也就不起做用了。若是匹配的子串在父字符串中没有对应的字符,返回结果就是-1.(能够利用search匹配字符串有无在表格中进行关键字搜索,条件判断是看是否等于-1)

function withSearch(str){
            var newStr = "";
            for(var i =0; i<str.length; i++){
                if(newStr.search(str[i]) == -1){
                    newStr += str[i];
                }
            }
            return newStr;
        }
        console.log(withSearch('abcdde'));     //abcde
复制代码
  • match()使用正则表达式与字符串相比较,接受参数只有一个要么是正则表达式,要么是reg对象,返回一个包含匹配结果的数组。本质上和调用正则的exec方法相同。

返回值:是由匹配结果组成的数组。和split同样返回的是数组,可是match返回的是第一个匹配的子串,不过能够应用全局标志g,搜索所有。

在 'abbcccbbbbbddbbbdabbb' 中查询重复 'b' 字符串

'abbcccbbbbbddbbbdabbb'.match(/b+/);     //['bb']
复制代码
  • replace()用正则表达式和字符串直接比较,而后用新的子串来替换被匹配的子串。 参数:传递两个参数,第一个是正则或匹配的字符串,第二个是要替换的新的内容或者函数。

返回值:是一个新的字符串,原始字符串不发生变化。若是第一个参数是字符串,那么只会替换第一个子字符串;想要替换全部子串,只有一个办法就是传入reg,同时指定g标志。

例:过滤字符串中空格:'aa b c d e f ' => "aabcdef" 使用全局界定符g进行全局匹配和替换。

str.replace(/\s+/g, ‘’);      //用空字符串替换匹配的空白
复制代码

正则方法

  • exec()在字符串中寻找匹配字符串,并返回一个包含匹配结果的数组。返回的数组很特别的带了两个属性,能够经过调用index属性和input属性查看匹配的子串在字符串中的位置,而input表示应用reg的字符串。

参数:要查找的字符串。

exec方法即便在模式中设置了全局标志g,每次也只会返回一个匹配项。在不设置g时,同一个str上屡次调用exec()都始终返回第一个匹配项;而设置了g,每次调用exec()都会在字符串中继续查找新的匹配项,知道搜索到字符串末尾为止。lastIndex在全局模式下回随着调用而改变++。《高级程序设计》

  • test() 检测字符串是否匹配正则表达式,传入的参数是字符串,若是字符串中有正则匹配的就返true。 正则表达式中若是没有限制开头也没有限制结尾,只要字符串中包含正则匹配的部分,就会返回一个true的值,不然返回false。

test方法常常用在if判断语句中做为条件来使用。

判断'aaddccddabcddeeddfff'是否包含'abc'字符串

/abc/.test('aaddccddabcddeeddfff');  //true
复制代码

正则表达式的术语和操做符

正则表达式的组成:由一些普通字符和一些特殊字符(又叫元字符--metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具备特殊的含义。 特殊字符: javascript中经常使用正则的特殊字符有

( ) [ ] { } \ ^ $ | ? * + . 若想匹配这类字符必须用转移符号 \ 如:\(,\^,\\

  • 精确匹配

正则表达式中是一些普通字符组成,在进行字符串匹配时,须要进行精确匹配,好比/good/,匹配时,字符串中必须包含g,o,o,d四个字符,并且顺序不能发生变化,中间也不容许出现其余字符,也就是说必须包含”good”字符串。

  • 预约义特殊字符

预约义特殊字符:

\t /\t/制表符,缩进 eg: console.log(/\t/.test('’)),表示匹配一个缩进或制表符

\n /\n/回车符 eg: console.log(/\n/.test(aaabbb)); ,表示匹配一个回车换行

问题:""不能包裹一个包含回车换行的字符串。

解决方法:将引号换成数字1前面的``引号,就能够包括回车。 \f /\f/换页符 \b /\b/空格,表示匹配的是一个空格,\b能够搭配字符匹配做为边界的查找标识符,在边界处详细讲。

  • 字符集
    字符集:表示一类中任何一个字符均可以匹配,核心是[]类对应的是一个字符。 字符集写法:[一类字符]

简单类:正则的多个字符对应一个字符,咱们能够用[]把它们括起来,让[]这个总体对应一个字符 o[abc]z →oaz,obz,ocz

范围类:有时匹配的东西过多,并且类型又相同,所有输入太麻烦,咱们能够在中间加了个横线。 [a-z]、[0-9]、[A-Z]

组合类:容许用中括号匹配不一样类型的单个字符[a-zA-Z0-9] [a-zA-Z_$][a-zA-Z0-9_$] 变量名的命名规则 [0-9a-z]:表示能够匹配小写字母或者数字。

负向类:[]内部最前面加个元字符^进行取反,表示匹配不能为括号里面的字符。 [^a]:表示只要不是a都能匹配成功。

  • 修饰符

g 全局修饰符,再查找时不会找到第一次结果后就结束,而是在找到全局范围内全部结果后再结束。 global:全球的、全局的。 书写位置:在正则符号的后面//g.

i 修饰符用于执行对大小写不敏感的匹配。case-insensitive 书写位置:在正则符号的后面//i

m表示多行模式,忽略换行。

  • 边界

^开头注意不能紧跟于左中括号的后面 书写位置:写在//正则符号内部的开始位置,表示后面的字符必须匹配成功,并且须要做为字符串的开头。

$结尾 书写位置:写在//正则符号内部的结束位置,表示$前面的字符必须匹配成功,并且须要做为字符串的结束。

综合使用^和 $,分别界定字符串的开头和结尾,表示中间部分的字符必须匹配成功,并且全部字符必须位于开头,也必须位于结尾。也就是说中间的部分就是字符串的所有。

\b单词边界,用于查找位于单词的开头或结尾的匹配。区间比^$要小,只做用在单词。 \b会搭配其余字符进行匹配,其余字符必须先匹配成功,若是\ba,要先匹配一个a字符,还要求a位于一个单词的开始位置,若是c\b,表示要匹配一个c字符,还要求c必须位于一个单词的结尾。

若是先后都有\b,表示内部匹配的结果必须是一个单独的完整的单词。

\B非单词边界,用于查找不处在单词的开头或结尾的匹配。 \B也要搭配其余符号进行匹配,表示前面后后面的匹配的字符,除了要匹配成功以外,还不能位于一个单词的开头或结尾。

  • 预约义类

本质就是将最经常使用的一些特殊类的字符集进行一个简化书写。

[^\n\r]除了换行和回车以外的任意字符 匹配:除了回车和换行以外其余全部字符,好比数字、字母、汉字、特殊符号、空格、缩进等。

\d[0-9]数字字符(digital) 匹配:匹配一个任意的数字字符。

\D[^0-9]非数字字符 匹配:非数字字符,只要不是数字都能匹配成功

\s[ \t\n\x0B\f\r]空白字符(space) 匹配:能够匹配全部的空白,包括缩进、回车、换行、空格、换页。

\S[^ \t\n\x0B\f\r]非空白字符 匹配:表示全部非空白的字符,除了空白都能匹配。

\w[a-zA-Z_0-9]单词字符(全部的字母/数字/下划线) 匹配:全部的字母(大小写)、数字、下划线。

\W[^a-zA-Z_0-9]非单词字符 匹配:除了数字、字母、下划线,其余都能匹配。

  • 量词

有时会遇到某个正则符号须要连续匹配屡次,能够利用量词进行次数描述。 使用{}包裹数字,表示前面的一个字符能够出现多少次。

{n}硬性量词对应零次或者n次 表示:n是几,前面的符号须要连续出现对应的几回。

{n,m}软性量词至少出现n次但不超过m次(中间不能有空格) 表示:前面的字符必须出现至少n次,最多不超过m次。

{n,}软性量词至少出现n次(+的升级版) 表示:前面的字符能够出现n次及以上。

?{0,1}软性量词出现零次或一次

*{0,}软性量词出现零次或屡次(任意次)

+{1,}软性量词出现一次或屡次(至少一次)

量词只能修饰前面的一个字符,不能直接修饰前面多个字符,想要操做多个要把想操做的字符串用小括号括起来。

  • 或操做符

可使用竖线(|)字符表示或者的关系。 若是没有任何限制的状况下,或操做符会将总体正则表达式分红两部分。 只要有一种状况匹配成功都能返回true。

若是咱们想匹配a和c中匹配d或b,须要将d和b的或关系放在小括号内,缩小或操做符的范围。

  • 分组

虽然量词的出现,能帮助咱们处理一排密紧密相连的同类型字符。但这是不够的,咱们用中括号表示范围内选择,大括号表示重复次数。若是想获取重复多个字符,咱们就要用小括号进行分组了。 使用小括号分组后,就能够对内部字符进行总体的控制。

  • 分组的反向引用

反向引用标识是对正则表达式中的匹配组捕获的子字符串进行编号,经过“\编号(在表达式中)”,“$编号(在表达式外)”进行引用。从1开始计数。

正则中若是有小括号的分组,会在字符串中找到匹配的子字符串,能够将子字符串结果拿到正则中进行二次使用,或者正则表达式以外进行二次调用。 正则表达式中有多个小括号的话,按照编号1,2,3……进行编号,从左往右。exec test str的replace均可以使用这种方法

正则中:使用\1,反向使用子串1的结果。

正则外面:使用$1,反向使用子串1的结果。

字符串的replace方法的反向引用。 第一个参数:正则表达式,内部有小括号的话,能够进行编号,按顺序小括号分别对应第一小组,第二小组...。 第二个参数:能够利用分组匹配结果,进行反向引用。

更经常使用的方式,给replace第二个参数设置为一个替换函数。

注意:

1.函数的参数位置,第一个必须写match,后面的参数可使用反向引用的编号$,$2……

2.函数必须有返回值,返回值的结果才是替换字符串的内容。

应用:找出字符串中最长的重复子串

function demo(str) {
        var arr = str.split(''); //把字符串转换为数组
        str = arr.sort().join(''); 

        var value = ‘’;     //用来存放出现最多的substr的中间变量
        var index = 0;     //用来存放最大长度
            
       var re = /(\w)\1+/g; //
           
        str.replace(re, function ($0, $1) {
            //alert($0); 表明每次匹配成功的结果 : aa dd jj kk l sssssssssssssssss
            //alert($1); 表明每次匹配成功的第一个子项,也就是\w: a d j k l s 

        if (index < $0.length) { //若是index保存的值小于$0的长度就进行下面的操做
            index = $0.length; // 这样index一直保存的就在最大的长度
            value = $0; //value保存的是出现最多的这个字符
        }
    });
        alert('最多的字符:' + value + ',重复的次数:' + index); 
    }
复制代码
  • 中文字符

匹配中文:[\u4e00-\u9fa5]

经常使用正则表达式

网上的一些经常使用方法

  • 用户名:4-16位,字母、数字、下划线、减号. 同时包括的内容能够经过放到一个类中,+进行屡次选择。
var pattern = /^[a-zA-Z0-9_-]{4,16}$/;
复制代码
  • 密码强度:最少6位,包括1个大写字母,1个小写,1个数字,1个特殊符号
var pattern = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/;
复制代码

(?<= )是连在一块儿的格式,不要把=单独拿出。与之对应的格式是(?<! )。

(?<=\s*)\d+ 匹配的是 "abc 123abc""abc123abc"中的"123" 匹配的是:前面有"重复0次或多个空格"后面紧跟的是数字的数字部分; 注:匹配的字符串只有\d+,不包括\s*

(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。 好比\b\w+(?=ing\b),匹配以 ing 结尾的单词的前面部分(除了 ing 之外的部分),如查找 I'm singing while you're dancing.时,它会匹配 sing 和 danc。 (?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式 exp。好比(?<=\bre)\w+\b 会匹配以re开头的单词的后半部分(除了 re之外的部分),例如在 查找reading a book时,它匹配ading。 假如你想要给一个很长的数字中每三位间加一个逗号(固然是从右边加起了), 你能够这 样查找须要在前面和里面添加逗号的部分:((?<=\d)\d{3})*\b,用它对 1234567890 进行查 找时结果是234567890。 下面这个例子同时使用了这两种断言:(?<=\s)\d+(?=\s)匹配以空白符间隔的数字(再次 强调,不包括这些空白符)

  • 数字:^[0-9]+$

  • n位的数字:^\d{n}$

  • 至少n位的数字:^\d{n,}$

  • m-n位的数字:^\d{m,n}$

  • 零和非零开头的数字:^(0|[1-9][0-9]*)$

  • 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$

  • 带1-2位小数的正数或负数:^(-)?\d+(.\d{1,2})?$

  • 正数、负数、和小数:^(-|+)?\d+(.\d+)?$

  • 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$

  • 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$

  • 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]){1,3}$ 或 ^+?[1-9][0-9]$

  • 非零的负整数:^-[1-9][]0-9"$ 或 ^-[1-9]\d$

  • 非负整数:^\d+$ 或 ^[1-9]\d*|0$

  • 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$

  • 非负浮点数:^\d+(.\d+)?$ 或 ^[1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0$

  • 非正浮点数:^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d*.\d*|0.\d*[1-9]\d*))|0?.0+|0$

  • 正浮点数:^[1-9]\d*.\d*|0.\d*[1-9]\d*$ 或 ^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$

  • 负浮点数:^-([1-9]\d*.\d*|0.\d*[1-9]\d*)$ 或 ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$

  • 浮点数:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0)$

  • 汉字:^[\u4e00-\u9fa5]{0,}$

  • 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$

  • 长度为3-20的全部字符:^.{3,20}$

  • 由26个英文字母组成的字符串:^[A-Za-z]+$

  • 由26个大写英文字母组成的字符串:^[A-Z]+$

  • 由26个小写英文字母组成的字符串:^[a-z]+$

  • 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$

  • 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$

  • 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$

  • 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$

  • 能够输入含有^%&',;=?$"等字符:[^%&',;=?$\x22]+

  • 禁止输入含有~的字符:[^~\x22]+

  • Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$

  • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

  • InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$

  • 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

  • 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$

  • 国内电话号码(0511-440522二、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}

  • 身份证号(15位、18位数字):^\d{15}|\d{18}$

  • 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$

  • 账号是否合法(字母开头,容许5-16字节,容许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

  • 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$

  • 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.\d)(?=.[a-z])(?=.*[A-Z]).{8,10}$

  • 日期格式:^\d{4}-\d{1,2}-\d{1,2}

  • 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$

  • 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$

  • 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$

  • 备注:这就是最终结果了,别忘了"+"能够用"*"替代若是你以为空字符串也能够接受的话(奇怪,为何?)最后,别忘了在用函数时去掉去掉那个反斜杠,通常的错误都在这里

  • xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$

  • 双字节字符:[^\x00-\xff] (包括汉字在内,能够用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))

  • 空白行的正则表达式:\n\s*\r (能够用来删除空白行)

  • HTML标记的正则表达式:<(\S*?)[^>]>.?</\1>|<.*? />

  • 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (能够用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),很是有用的表达式)

  • 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)

  • 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)

  • IP地址:\d+.\d+.\d+.\d+ (提取IP地址时有用)

  • IP地址:((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))

相关文章
相关标签/搜索