js_正则表达式专项

创建方式

使用构造函数创建:

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));
  • 在字符串内检索指定的值,匹配成功返回第一个匹配成功的字符串片段开始的位置,否则返回-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));
  • 2019.12.2补充:

有九个用于存储捕获组的构造函数属性。访问这些属性的语法是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也会被匹配响应捕获组的字符串自动填充。

  • 2019.12.27补充:
    正则表达式匹配中文:
[\u4e00-\u9fa5]
||或者
[^\x00-\xff]
posted @ 2020-03-05 21:12  Syinho  阅读(349)  评论(0编辑  收藏  举报