正则表达式是一种被用于匹配字符串的字符匹配模式。多用于表单验证。正则表达式:regular expression,简称RegExp。javascript
字面量:用两个/作界定符。通常会将字面量赋值给一个变量。java
var pattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
git
正则表达式可使用一些字符串方法或正则方法进行操做:正则表达式
字符串的方法:express
正则表达式方法:数组
若是没有找到分隔符,那么返回的数组包含的是一整个str组成元素的数组。若是分隔符为空字符串“”,返回的是字符串每一个字符组成元素的数组。 返回值:由切割后的子字符串组成数组。能够用来将用户输入的不规范的字符串转为正确的Array。bash
例:根据空格切割字符串:'aa bbb c dd eeeeee'函数
'aa bbb c dd eeeeee'.split(/\s+/); //["aa","bbb","c","dd","eeeeee"]
复制代码
\s:表示空白字符;测试
+:表示前面的一个符号表明的字符能够出现一次或者屡次ui
返回值:子串或正则匹配结果在父字符串中的第一次出现的位置的下标。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
复制代码
返回值:是由匹配结果组成的数组。和split同样返回的是数组,可是match返回的是第一个匹配的子串,不过能够应用全局标志g,搜索所有。
在 'abbcccbbbbbddbbbdabbb' 中查询重复 'b' 字符串
'abbcccbbbbbddbbbdabbb'.match(/b+/); //['bb']
复制代码
返回值:是一个新的字符串,原始字符串不发生变化。若是第一个参数是字符串,那么只会替换第一个子字符串;想要替换全部子串,只有一个办法就是传入reg,同时指定g标志。
例:过滤字符串中空格:'aa b c d e f ' => "aabcdef" 使用全局界定符g进行全局匹配和替换。
str.replace(/\s+/g, ‘’); //用空字符串替换匹配的空白
复制代码
参数:要查找的字符串。
exec方法即便在模式中设置了全局标志g,每次也只会返回一个匹配项。在不设置g时,同一个str上屡次调用exec()都始终返回第一个匹配项;而设置了g,每次调用exec()都会在字符串中继续查找新的匹配项,知道搜索到字符串末尾为止。lastIndex在全局模式下回随着调用而改变++。《高级程序设计》
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也要搭配其余符号进行匹配,表示前面后后面的匹配的字符,除了要匹配成功以外,还不能位于一个单词的开头或结尾。
本质就是将最经常使用的一些特殊类的字符集进行一个简化书写。
[^\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]
网上的一些经常使用方法
var pattern = /^[a-zA-Z0-9_-]{4,16}$/;
复制代码
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))