创建方式
使用构造函数创建:
var str='hello world';
var reg1=new RegExp('o','gi');
参数1:要匹配的字符(不能有空格)
参数2:匹配模式(常用g(全局匹配),i(忽略大小写))
字面量方式创建
var reg2=/o/gi;
方法
test()
console.log(reg1.test(str));
exec()
- 检索字符串中指定的值。匹配成功返回一个数组,匹配失败返回null
console.log(reg1.exec(str));
//返回一个数组:["o",index:4,input:"hello world",groups:undefined]
//0:"o" 表示第一个与正则表达式相匹配的值
//groups:undefined
//index:4 index属性声明的是匹配文本的第一个字符的位置
//input:"hello world" input属性存放的是被检索的字符串string
//length:1
//__proto__:Array
match()
- 在字符串内检索指定的值,匹配成功返回存放匹配结果的数组,否则返回null
console.log(str.match(reg1));
search()
- 在字符串内检索指定的值,匹配成功返回第一个匹配成功的字符串片段开始的位置,否则返回-1
var reg=/javascript/i;
var str="hello Javascript Javascript Javascript";
console.log(str.search(reg));
replace()
- 替换与正则表达式匹配的字符串,并返回替换后的字符串。再不设置全局匹配g的时候,只替换第一个匹配成功的字符串片段。
var reg1=/javascript/i;
var reg2=/javascript/gi;
var str="hello Javascript Javascript Javascript";
console.log(str.replace(reg1,"js"));
//hello js Javascript Javascript
console.log(str.replace(reg2,"js"));
//hello js js js
split()
var reg1=/cr/i;
var str="hello Javascript";
var res=str.split(reg1);
console.log(res);
元字符(匹配的规则)
|
|
|
\d |
0-9的任意数字 |
\d\d将匹配72,但不匹配aa或7a |
\D |
任何非数字字符 |
\D\D\D将匹配abc,但不匹配123或8ef |
\w |
任何单词字符,即A-Z,a-z,0-9以及下划线等字符 |
\w\w\w\w匹配Ab_2,但不匹配&$%*或者Ab_@ |
|
|
|
\W |
任何非单词字符 |
\W匹配@,但不匹配a |
\s |
任何空白字符 |
与制表符、回车符、换页符或竖杠空格匹配 |
\S |
任何非空白字符 |
\S匹配A,但不匹配制表符 |
. |
除换行符(\n)外的任意单个字符 |
.匹配a或者4,或者@ |
[...] |
匹配位于方括号之内的任何一个字符,[a-z]将匹配a-z范围内的任何字符 |
[abc]匹配a、b、c,但不匹配任何其他字符 |
[^...] |
匹配除方括号内的字符之外的任何字符 |
[abc]将匹配除了a、b、c外的任何字符,[a-z]将匹配除了a-z范围之外的任何字符 |
特殊字符
|
|
|
|
前一项出现n次 |
x{2}与xx匹配 |
|
前一项出现n次,或者n次以上 |
x{2,}匹配xx,xxx,xxxx,xxxxx等 |
|
前一项至少出现n次,最多出现m次 |
x{2,4}匹配xx,xxx,xxxx |
? |
前一项出现0次或1次,等同于 |
x?匹配空串或者x |
+ |
前一项出现1次或多次 |
x+匹配x、xx、xxx、xxxx等 |
* |
前一项出现0次或多次 |
x*匹配空串、或者x、xx、xxx等 |
位置字符
|
|
\b |
匹配单词分界位置,即单词字符与非单词字符之间的位置 |
\B |
匹配非单词分界位置 |
特殊匹配
|
|
^ |
匹配输入的开始。如果多行标志被设置为 true,那么也匹配换行符后紧跟的位置。例如,/^A/ 并不会匹配 "an A" 中的 'A',但是会匹配 "An E" 中的 'A'。当 '^' 作为第一个字符出现在一个字符集合模式时,它将会有不同的含义。 |
$ |
匹配输入的结束。如果多行标示被设置为 true,那么也匹配换行符前的位置。例如,/t$/ 并不会匹配 "eater" 中的 't',但是会匹配 "eat" 中的 't'。 |
? |
如果紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。例如,对 "123abc" 使用 /\d+/ 将会匹配 "123",而使用 /\d+?/ 则只会匹配到 "1"。还用于先行断言中,如本表的 x(?=y) 和 x(?!y) 条目所述。 |
(x) |
模式 /(foo) (bar) \1 \2/ 中的 '(foo)' 和 '(bar)' 匹配并记住字符串 "foo bar foo bar" 中前两个单词。模式中的 \1 和 \2 表示第一个和第二个被捕获括号匹配的子字符串,即 foo 和 bar,匹配了原字符串中的后两个单词。注意 \1、\2、...、\n 是用在正则表达式的匹配环节,详情可以参阅后文的 \n 条目。而在正则表达式的替换环节,则要使用像 $1、$2、...、$n 这样的语法,例如,'bar foo'.replace(/(...) (...)/, '$2 $1')。{{(x) 模式 /(foo) (bar) \1 \2/ 中的 '(foo)' 和 '(bar)' 匹配并记住字符串 "foo bar foo bar" 中前两个单词。模式中的 \1 和 \2 表示第一个和第二个被捕获括号匹配的子字符串,即 foo 和 bar,匹配了原字符串中的后两个单词。注意 \1、\2、...、\n 是用在正则表达式的匹配环节,详情可以参阅后文的 \n 条目。而在正则表达式的替换环节,则要使用像 $1、$2、...、$n 这样的语法,例如,'bar foo'.replace(/(...) (...)/, '$2 $1')。$& 表示整个用于匹配的原字符串。(uploading...)}} 表示整个用于匹配的原字符串。 |
(?:x) |
匹配 'x' 但是不记住匹配项。这种括号叫作非捕获括号,使得你能够定义与正则表达式运算符一起使用的子表达式。看看这个例子 /(?:foo){1,2}/。如果表达式是 /foo{1,2}/,{1,2} 将只应用于 'foo' 的最后一个字符 'o'。如果使用非捕获括号,则 {1,2} 会应用于整个 'foo' 单词。 |
x(?=y) |
匹配'x'仅仅当'x'后面跟着'y'.这种叫做先行断言。例如,/Jack(?=Sprat)/会匹配到'Jack'仅仅当它后面跟着'Sprat'。/Jack(?=Sprat|Frost)/匹配‘Jack’仅仅当它后面跟着'Sprat'或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。 |
(?<=y)x |
例如,/(?<=Jack)Sprat/会匹配到' Sprat '仅仅当它前面是' Jack '。/(?<=Jack|Tom)Sprat/匹配‘ Sprat ’仅仅当它前面是'Jack'或者是‘Tom’。但是‘Jack’和‘Tom’都不是匹配结果的一部分。 |
x(?!y) |
仅仅当'x'后面不跟着'y'时匹配'x',这被称为正向否定查找。例如,仅仅当这个数字后面没有跟小数点的时候,/\d+(?!.)/ 匹配一个数字。正则表达式/\d+(?!.)/.exec("3.141")匹配‘141’而不是‘3.141’ |
(?<!y)x |
仅仅当'x'前面不是'y'时匹配'x',这被称为反向否定查找。例如, 仅仅当这个数字前面没有负号的时候,/(?<!-)\d+/ 匹配一个数字。/(?<!-)\d+/.exec('3') 匹配到 "3"./(?<!-)\d+/.exec('-3') 因为这个数字前有负号,所以没有匹配到。 |
x|y |
匹配‘x’或者‘y’。例如,/green|red/匹配“green apple”中的‘green’和“red apple”中的‘red’ |
实例
单词分界
var str1="Hello World! let's look at boundaries said 007.";
var reg1=/\b/gi;
var res=str1.replace(reg1,"|");
console.log(res);
//|Hello| |World|! |let|'|s| |look| |at| |boundaries| |said| |007|.
非单词分界
//H|e|l|l|o W|o|r|l|d!| l|e|t's l|o|o|k a|t b|o|u|n|d|a|r|i|e|s s|a|i|d 0|0|7.|
更详细的说明
检索字符串中是否不包含字母
let str1=`dhvwv5486`;
let str2=`8599844`;
let reg=new RegExp(`[a-zA-z]`,`gi`);
console.log(str1.search(reg));//0
console.log(str2.search(reg));//-1
去除字符串空格
let str=" Hello World";
let reg=new RegExp(`\\s`);
console.log(str.replace(reg,""));
检查用户账户
//用户账户名只能由大小写字母、数字和下划线组成
//且不允许以数字和下划线开头,用户名限长9个字符
var userName=prompt("请输入用户名","username");
function check(userName){
let reg=/^[a-zA-z]\w{0,9}$/;
if(reg.test(userName)&&userName.length<=9){
return true;
}else{
return false;
}
}
alert(check(userName));
匹配11位手机号码
//手机号码以1开头
function check(TelNum){
let reg=new RegExp(`^1\\d{10}$`);
if(reg.test(TelNum)){
return true;
}else{
return false;
}
}
匹配固定号码
//国际号码:“+”后跟1到3个数字
//本地区号:2-5个数字,有时带括号
//实际的用户号码:3-10个数字,有时带括号
//分机号码:2-5个数字,其前面是x、xtn、extn、pax、pbx或extension,有时带括号
//例子:+1(123)1234567 +1123123456 +44(123)1234567ext123
var res=prompt("","");
var reg=/^(\+\d{1,3} ?)?(\(?\d{2,5}\)?)?\(?\d{3,10}\)?\(?(x|xtn|extn|pax|pbx|extension)?\)?\d{2,5}?$/gi;
alert(reg.test(res));
验证邮箱
//邮箱组成:第一部分@第二部分
//第一部分:由字母、数字、下划线、短线、点号组成,首字母必须是字母或数字
//第二部分:由字母、数字、短线、域名后缀(.cn、.com、.net)组成,
//最后的.com和.cn是可以互换位置的,然后也可以只有.com没有.cn或只有.cn没有.com
var res=prompt("","");
var reg=/^[a-zA-Z0-9]{1}[\w\.\-]+@[\w\-]+\.(com|cn|net)?\.?(com|cn|net)?$/;
alert(reg.test(res));
有九个用于存储捕获组的构造函数属性。访问这些属性的语法是RegExp.$1、RegExp.$2...分别用于储存第一一直到第九个匹配的捕获组。在调用exec()或test()方法时,这些属性会被自动填充。然后,就可以像下面这样使用:
var text="this has benn a short summer";
var pattern=/(..)or(.)/g;
if(pattern.test(text)){
console.log(RegExp.$1);//sh
console.log(RegExp.$2);//t
}
即使test()方法只返回一个布尔值,但RegExp构造函数的属性$1和$2也会被匹配响应捕获组的字符串自动填充。
[\u4e00-\u9fa5]
||或者
[^\x00-\xff]