加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式

发布时间:2020-12-13 22:52:31 所属栏目:百科 来源:网络整理
导读:正则表达式 (regular expression) 是一个描述字符模式的对象。 ECMAScript 的 RegExp 类表示正则表达式,而 String 和 RegExp 都定义了使用正则表达式进行强大的模式匹配和文本检索与替换的函数。 创建正则表达式和创建字符串类似,创建正则表达式提供了两种
  • 正则表达式(regular expression)是一个描述字符模式的对象。ECMAScriptRegExp类表示正则表达式,而StringRegExp都定义了使用正则表达式进行强大的模式匹配和文本检索与替换的函数。

  • 创建正则表达式和创建字符串类似,创建正则表达式提供了两种方法,一种是采用new运算符,另一个是采用字面量方式。

  • varr=newRegExp('reg');//第一个参数字符串
    varr=newRegExp('reg','ig');//第二个参数可选模式修饰符
    //i忽略大小写;g全局匹配;m多行匹配;
    varr=/reg/;//直接用两个反斜杠
    varr=/reg/ig;//在第二个斜杠后面加上模式修饰
  • RegExp对象包含两个方法:test()exec(),功能基本相似,用于测试字符串匹配。test()方法在字符串中查找是否存在指定的正则表达式并返回布尔值,如果存在则返回true,不存在则返回falseexec()方法也用于在字符串中查找指定正则表达式,如果exec()方法执行成功,则返回包含该查找字符串的相关信息数组。如果执行失败,则返回null

  • test方法在字符串中测试模式匹配,返回truefalse;exec方法在字符串中执行匹配搜索,返回结果数组;

  • //使用new运算符的test方法
    varpattern=newRegExp('test','i');//创建正则模式,不区分大小写
    varstr='Thisistest!';//创建要比对的字符串
    alert(pattern.test(str));//通过test()方法验证是否匹配
    
    //使用字面量方式的test方法
    varpattern=/test/i;//创建正则模式,不区分大小写
    varstr='Thisistest!';
    alert(pattern.test(str));
    
    //使用一条语句实现正则匹配
    alert(/test/i.test('Thisistest!'));//模式和字符串替换掉了两个变量
    
    //使用exec返回匹配数组
    varpattern=/test/i;
    varstr='Thisistest!';
    alert(pattern.exec(str));//匹配了返回数组,否则返回null
  • String对象提供了4个使用正则表达式的方法
    match(pattern)
    返回pattern中的子串或null
    replace(pattern,replacement)
    replacement替换pattern
    search(pattern)
    返回字符串中pattern开始位置
    split(pattern)
    返回字符串按指定pattern拆分的数组
  • //使用match方法获取获取匹配数组
    varpattern=/desk/ig;//全局搜索
    varstr='ThisisaDesk!,ThatisaDesktoo';
    alert(str.match(pattern));//匹配到两个Desk,Desk
    alert(str.match(pattern).length);//获取数组的长度
    
    //使用search来查找匹配数据
    varpattern=/desk/ig;
    varstr='ThisisaDesk!,ThatisaDesktoo';
    alert(str.search(pattern));//查找到返回位置,否则返回-1
    
    //search方法查找到即返回,也就是说无需g全局
    
    //使用replace替换匹配到的数据
    varpattern=/desk/ig;
    varstr='ThisisaDesk!,ThatisaDesktoo';
    alert(str.replace(pattern,'Book'));//将Desk替换成了Book
    
    //使用split拆分成字符串数组
    varpattern=//ig;
    varstr='ThisisaDesk!,ThatisaDesktoo';
    alert(str.split(pattern));//以空格拆开分组成数组
  • RegExp对象的静态属性



    input
    $_
    当前被匹配的字符串
    lastMatch
    $&
    最后一个匹配字符串
    lastParen
    $+
    最后一对圆括号内的匹配子串
    leftContext
    $`(反引号)
    最后一次匹配前的子串
    multiline
    $*
    用于指定是否所有的表达式都用于多行的布尔值
    rightContext
    $'(单引号)
    在上次匹配之后的子串
  • //Opera不支持input、lastMatch、lastParen和multiline属性。IE不支持multiline属性。
    varpattern=/(g)oogle/;
    varstr='Thisisgoogle!';
    pattern.test(str);//执行一下
    alert(RegExp.input);//Thisisgoogle!
    alert(RegExp.leftContext);//Thisis
    alert(RegExp.rightContext);//!
    alert(RegExp.lastMatch);//google
    alert(RegExp.lastParen);//g
    alert(RegExp.multiline);//false
    //RegExp.input可以改写成RegExp['$_'],依此类推。RegExp.input可以写成RegExp.$_。
  • RegExp对象的实例属性
    global
    Boolean值,表示g是否已设置
    ignoreCase
    i是否已设置
    lastIndex
    整数,代表下次匹配将从哪里字符位置开始
    multiline
    m是否已设置
    Source
    正则表达式的源字符串形式
  • //使用实例属性
    varpattern=/google/ig;
    alert(pattern.global);//true,是否全局了
    alert(pattern.ignoreCase);//true,是否忽略大小写
    alert(pattern.multiline);//false,是否支持换行
    alert(pattern.lastIndex);//0,下次的匹配位置
    alert(pattern.source);//google,正则表达式的源字符串
    
    varpattern=/google/g;
    varstr='googlegooglegoogle';
    pattern.test(str);//google,匹配第一次
    alert(pattern.lastIndex);//6,第二次匹配的位
  • 元字符/元符号
    匹配范围
    .
    除换行符外的任意字符
    [a-z0-9]
    括号中的字符集中的任意字符
    [^a-z0-9]
    任意不在括号中的字符集中的字符
    d
    数字
    D
    非数字,同[^0-9]相同
    w
    字母和数字及_
    W
    非字母和数字及_

    null字符
    b
    空格字符
    f
    进纸字符
    n
    换行符
    r
    回车字符
    t
    制表符
    s
    空白字符、空格、制表符和换行符
    S
    非空白字符
    ^
    行首匹配
    $
    行尾匹配
    A
    仅字符串开始处
    b
    单词边界,词在[]内时无效
    B
    非单词边界
    G
    当前搜索的开始位置
    Z
    字符串结束处或行尾
    z
    仅字符串结束处
    x?
    0个或1x
    x*
    0个或任意多个x
    x+
    至少一个(xyz)+
    至少一个(xyz)
    x{m,n}
    最少m个x、最多na|b|c
    abc中任意一个
    (string)
    用于反向引用的分组
    1$1
    第一个分组中的内容
    2$2
    第二个分组中的内容
    3$3
    第三个分组中的内容


  • //使用点元字符
    varpattern=/g..gle/;//.匹配一个任意字符
    varstr='google';
    alert(pattern.test(str));
    
    //重复匹配
    varpattern=/g.*gle/;//.匹配0个一个或多个
    varstr='google';//*,?,+,{n,m}
    alert(pattern.test(str));
    
    //使用字符类匹配
    varpattern=/g[a-zA-Z_]*gle/;//[a-z]*表示任意个a-z中的字符
    varstr='google';
    alert(pattern.test(str));
    
    varpattern=/g[^0-9]*gle/;//[^0-9]*表示任意个非0-9的字符
    varstr='google';
    alert(pattern.test(str));
    
    varpattern=/[a-z][A-Z]+/;//[A-Z]+表示A-Z一次或多次
    varstr='gOOGLE';
    alert(pattern.test(str));
    
    /*使用元符号匹配*/
    varpattern=/gw*gle/;//w*匹配任意多个所有字母数字_
    varstr='google';
    alert(pattern.test(str));
    
    varpattern=/googled*/;//d*匹配任意多个数字
    varstr='google444';
    alert(pattern.test(str));
    
    varpattern=/D{7,}/;//D{7,}匹配至少7个非数字
    varstr='google8';
    alert(pattern.test(str));
    
    /*使用锚元字符匹配*/
    varpattern=/^google$/;//^从开头匹配,$从结尾开始匹配
    varstr='google';
    alert(pattern.test(str));
    
    varpattern=/goosgle/;//s可以匹配到空格
    varstr='google';
    alert(pattern.test(str));
    
    varpattern=/googleb/;//b可以匹配是否到了边界
    varstr='google';
    alert(pattern.test(str));
    
    /*使用或模式匹配*/
    varpattern=/google|baidu|bing/;//匹配三种其中一种字符串
    varstr='google';
    alert(pattern.test(str));
    
    /*使用分组模式匹配*/
    varpattern=/(google){4,8}/;//匹配分组里的字符串4-8次
    varstr='googlegoogle';
    alert(pattern.test(str));
    
    varpattern=/8(.*)8/;//获取8..8之间的任意字符
    varstr='Thisis8google8';
    str.match(pattern);
    alert(RegExp.$1);//得到第一个分组里的字符串内容
    
    varpattern=/8(.*)8/;
    varstr='Thisis8google8';
    varresult=str.replace(pattern,'<strong>$1</strong>');//得到替换的字符串输出
    document.write(result);
    
    varpattern=/(.*)s(.*)/;
    varstr='googlebaidu';
    varresult=str.replace(pattern,'$2$1');//将两个分组的值替换输出
    document.write(result);
  • //贪婪	+,*,{n},},m}
    //惰性	+?,??,*?,{n}?,}?,m}?
    //关于贪婪和惰性
    varpattern=/[a-z]+?/;//?号关闭了贪婪匹配,只替换第一个
    varstr='abcdefjhijklmnopqrstuvwxyz';
    varresult=str.replace(pattern,'xxx');
    alert(result);
    
    varpattern=/8(.+?)8/g;//禁止了贪婪,开启的全局
    varstr='Thisis8google8,Thatis8google8,Thereis8google8';
    varresult=str.replace(pattern,'<strong>$1</strong>');
    document.write(result);
    
    varpattern=/8([^8]*)8/g;//另一种禁止贪婪
    varstr='Thisis8google8,'<strong>$1</strong>');
    document.write(result);
    
    //使用exec返回数组
    varpattern=/^[a-z]+s[0-9]{4}$/i;
    varstr='google2012';
    alert(pattern.exec(str));//返回整个字符串
    
    varpattern=/^[a-z]+/i;//只匹配字母
    varstr='google2012';
    alert(pattern.exec(str));//返回google
    
    varpattern=/^([a-z]+)s([0-9]{4})$/i;//使用分组
    varstr='google2012';
    alert(pattern.exec(str)[0]);//google2012
    alert(pattern.exec(str)[1]);//google
    alert(pattern.exec(str)[2]);//2012
    
    //捕获性分组和非捕获性分组
    varpattern=/(d+)([a-z])/;//捕获性分组
    varstr='123abc';
    alert(pattern.exec(str));
    
    varpattern=/(d+)(?:[a-z])/;//非捕获性分组
    varstr='123abc';
    alert(pattern.exec(str));
    
    //使用分组嵌套
    varpattern=/(A?(B?(C?)))/;//从外往内获取
    varstr='ABC';
    alert(pattern.exec(str));
    
    //使用前瞻捕获
    varpattern=/(goo(?=gle))/;//goo后面必须跟着gle才能捕获
    varstr='google';
    alert(pattern.exec(str));
    
    
    //使用特殊字符匹配
    varpattern=/.[/b]/;//特殊字符,用符号转义即可
    varstr='.[/b]';
    alert(pattern.test(str));
    
    //使用换行模式
    varpattern=/^d+/mg;//启用了换行模式
    varstr='1.baidun2.googlen3.bing';
    varresult=str.replace(pattern,'#');
    alert(result);
  • //常用的正则
    //邮政编码
    varpattern=/[1-9][0-9]{5}/;//共6位数字,第一位不能为0
    varstr='224000';
    alert(pattern.test(str));
    
    //文件压缩包
    varpattern=/[w]+.zip|rar|gz/;//w表示所有数字和字母加下划线
    varstr='123.zip';//.表示匹配.,后面是一个选择
    alert(pattern.test(str));
    
    //删除多余空格
    varpattern=/s/g;//g必须全局,才能全部匹配
    varstr='111222333';
    varresult=str.replace(pattern,'');//把空格匹配成无空格
    alert(result);
    
    //删除首尾空格
    varpattern=/^s+/;//强制首
    varstr='google';
    varresult=str.replace(pattern,'');
    pattern=/s+$/;//强制尾
    result=result.replace(pattern,'');
    alert('|'+result+'|');
    
    varpattern=/^s*(.+?)s*$/;//使用了非贪婪捕获
    varstr='google';
    alert('|'+pattern.exec(str)[1]+'|');
    
    varpattern=/^s*(.+?)s*$/;
    varstr='google';
    alert('|'+str.replace(pattern,'$1')+'|');//使用了分组获取
    
    //简单的电子邮件验证
    varpattern=/^([a-zA-Z0-9_.-]+)@([a-zA-Z0-9_.-]+).([a-zA-Z]{2,4})$/;
    varstr='yc60.com@gmail.com';
    alert(pattern.test(str));
    
    varpattern=/^([w.-]+)@([w.-]+).([w]{2,4})$/;
    varstr='yc60.com@gmail.com';
    alert(pattern.test(str));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读