第五天 正则表达式

94 阅读6分钟

正则表达式基础

使用test( )方法

测试正则表达式的一种方法是使用.test()方法。

var testStr = "You are a genius"; 
var testRegex = /are/;  // 注意, /are/ 不需要引号 
var hasAre = testRegex.test(testStr); // 返回 true 
console.log(hasAre);

匹配文字字符串

/Are/ 只能匹配到Are 不能匹配到ARE或者are

匹配多种可能性的文字字符串

同时需要匹配catdogbird

/cat|dog|bird/

忽视大小写

可以通过忽视大小写的标志i实现

/dog|cat|bird/i

使用match( )方法提取匹配项

使用indexOflastIndexOf可以获取字符串的位置 使用.match直接返回字符串

testString.match(testRegx)

全局匹配

可以使用多个标志 /dog/ig

/dog/ 只能进行一次搜索提取
/dog/g 可以进行多次搜索提取

使用通配符.匹配任何内容

例如想同时匹配hug hut hum hun

/hu./即可

单个字符多可能性匹配

使用字符串匹配/dog/和使用通配符匹配/d.g/是两种极端情况但又是需要更加精确.使用字符集[ ]

/d[oiu]/只能匹配dog dig dug

匹配字母表中的字母和数字

/[a-e]at/gi //使用连字符-表示从a到e
/[0-6]/gi //表示数字0到6
/[a-e0-6]/gi //表示字母a-e以及数字0-6

创建否定字符集

在开头使用字符^

/[^0-9aeiou]/ig //匹配所有非数字和元音字符

匹配出现一次或者多次的字符串

使用符号+

/s+/g  //匹配出现一次多次s的字符

匹配出现0次或者多次的字符串

使用符号*

/go*/ //匹配结果可以为g go goo gooo

用惰性匹配来查找字符

贪婪匹配最长 惰性匹配使用字符?匹配最短

var str = "titanic"; 
var regex1 = /t[a-z]*i/; 
var regex2 = /t[a-z]*?i/; 
console.log( str.match(regex1) ); // 返回为 ["titani"] 
console.log( str.match(regex2) ); // 返回为 ["ti"]

/<h.*?1>/  //返回<h1>

匹配字符串的开头

^在字符集内时表示否定 在字符集外时表示匹配开头

var firstString = "Loen is first and can be found."; 
var firstRegex = /^Loen/; 
console.log( firstRegex.test(firstString) ); // 返回 true 
var notFirst = "You can't find Loen";
console.log( firstRegex.test(notFirst) //返回false

匹配字符串的结尾

使用字符$

var LastRegex =/Loen$/;
var Last = "You can't find Loen";
console.log( LastRegex.test(Last) //返回true

匹配所有字母和数字

/[a-zA-Z0-9]+/ == /\w/

匹配所有的数字

/[0-9]/ == /\d/

匹配所有非数字

/[^0-9]/ == /\D/

元字符

元字符描述
·查找单个字符,除了换行和结束符
\w查找单词字符
\W查找非单词字符
\d查找数字
\D查找非数字字符
\s查找空白字符
\S查找非空白字符
\b匹配单词边界
\B匹配非单词边界
\0查找NULL字符
\n查找换行符
\f查找换页符
\r查找回车符
\t查找制表符
\v查找垂直制表符
\xxx查找以八进制数xxxx规定的字符
\xdd查找以十六进制数dd规定的字符
\uxxxx查找以十六进制xxxx规定的Unicode字符

限制可能的用户名

  1. 用户名只能是数字字母字符。\
  2. 用户名中的数字必须在最后,且数字可以有零个或多个。\
  3. 用户名字母可以是小写字母和大写字母。\
  4. 用户名长度必须至少为两个字符。
    两位用户名只能使用字母。
var username = "JackOfAllTrades";
var userCheck = /^[a-z]([0-9]{2,}|[a-z]+\d*)$/i;
var result = userCheck.test(username);
console.log(result);

指定匹配的上限和下限

/a{3,5}h/ //匹配出现3-5次a的字符串
/a{3,}h/ //匹配出现3次以上a的字符串
/a{3}h/ //匹配出现3次a的字符串

正向先行断言和负向先行断言

正向先行断言的用法是(?=...)其中...就是需要存在但不会被匹配的部分。会先查看并确保搜索匹配模式中的元素存在但不会被匹配的部分 负向先行断言的用法是(?!...)其中...是希望不存在的匹配模式。会先查看确保搜索匹配模式中的元素不存在

var pwRegex = /^(?=\w{6})(?=\D+\d{2})/;//大于5个字符且有两个连续数字的密码,并且不能以数字开头
var checkPass = /(?=\w{3,6})(?=\D*\d)/; //3-6个字符且至少包含一个数字

检查混合字符串

var myString = "Eleanor Roosevelt";
var myRegex = /(Franklin|Eleanor).*Roosevelt/g; 
var result = myRegex.test(myString);
console.log(result);

使用捕获组重用模式

使用捕获组搜寻重复的子字符串。括号()可以用来匹配重复的子字符串。只需要把重复匹配模式的正则表达式放在括号即可。要指定重复字符串将出现的位置,可以用反斜杠\后接一个数字,数字从1开始,随着你使用的每一个捕获组的增加而增加。 例子:

var repeatStr = "regex regex";
var repeatRegex = /(\w+)\s\1/;
console.log( repeatRegex.test(repeatStr) ); // 返回 true
console.log( repeatStr.match(repeatRegex) ); // 返回 ["regex regex", "regex"]

例子:匹配在字符串中仅重复三次的数字,每一个都由空格分隔。

var repeatNum = "42 42 42";
var reRegex = /^(\d+)\s\1\s\1$/;
var result = reRegex.test(repeatNum);
console.log(result);

使用捕获组搜索和替换

使用.replace方法来搜索并替换字符串的文本。输入参数首先是要搜索的匹配模式,第二个参数是用于替换匹配的字符串或用于执行某些操作的函数。 例子:

var wrongText = "The sky is silver.";
var silverRegex = /silver/;
console.log( wrongText.replace(silverRegex, "blue") ); // 返回 "The sky is blue."

还可以使用$访问替换字符串中的捕获组

let res = "Code Learn".replace(/(\w+)\s(\w+)/, '$2 $1'); // 返回 "Learn Code" 
console.log(res);

删除开头和结尾的空白

有时字符串周围存在的空白字符并不是必须的,需要删除开头和结尾处的空格

var hello = "   Hello, World!  ";
var wsRegex = /^(\s+)(.+[^\s])(\s+)$/;
var result = hello.replace(wsRegex, '$2');
console.log(result);

常用正则表达式

注:

作者:晴天有点孤单 链接:juejin.cn/post/684490…

特殊需求

1 Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
3 InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
4 手机号码: ^(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}$
5 电话号码:^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
6 国内电话号码(0511-4405222021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
7 身份证号(15位、18位数字):^\d{15}|\d{18}$
8 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
9 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
10 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
11 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
12 日期格式:^\d{4}-\d{1,2}-\d{1,2}
13 一年的12个月(0109112):^(0?[1-9]|1[0-2])$
14 一个月的31天(0109131):^((0?[1-9])|((1|2)[0-9])|30|31)$
15 有四种钱的表示形式我们可以接受:"10000.00""10,000.00", 和没有 "分""10000""10,000":^[1-9][0-9]*$
16 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
17 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
18 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
19 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10""10.2" 是通过的:^[0-9]+(.[0-9]{2})?$\
20 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
21 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
22 13个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$\
23 xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
24 中文字符的正则表达式:[\u4e00-\u9fa5]
25 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2ASCII字符计1)) 
26 空白行的正则表达式:\n\s*\r (可以用来删除空白行) 
27 HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*?/> (对于复杂的嵌套标记依旧无能为力) 
28 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式) 
29 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始) 
30 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字) 
31 IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)

校验字符

1 汉字:^[\u4e00-\u9fa5]{0,}$ 
2 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$ 
3 长度为3-20的所有字符:^.{3,20}$ 
426个英文字母组成的字符串:^[A-Za-z]+$ 
526个大写英文字母组成的字符串:^[A-Z]+$ 
626个小写英文字母组成的字符串:^[a-z]+$ 
7 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$ 
8 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$ 
9 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$ 
10 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$ 
11 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+ 
12 禁止输入含有~的字符:[^~\x22]+

校验数字

1 数字:^[0-9]*$ 
2 n位的数字:^\d{n}$ 
3 至少n位的数字:^\d{n,}$ 
4 m-n位的数字:^\d{m,n}$ 
5 零和非零开头的数字:^(0|[1-9][0-9]*)$ 
6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 
71-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$ 
8 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$ 
9 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 
101~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ 
11 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$ 
12 非零的负整数:^-[1-9]\d*$ 
13 非负整数:^\d+$ 或 ^[1-9]\d*|0$ 
14 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$ 
15 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ 16 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ 
17 正浮点数:^[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]*))$ 
18 负浮点数:^-([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]*)))$ 
19 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$