JavaScript 正则表达式 RegExp 对象

本文深入探讨了正则表达式的概念、语法、修饰符、方括号、元字符、量词等核心内容,并提供了实例说明如何在实际场景中应用正则表达式。

(书籍上更详细)

RegExp 对象

RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。

直接量语法

/pattern/attributes

创建 RegExp 对象的语法:

new RegExp(pattern, attributes);

参数

参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。

参数 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。

返回值

一个新的 RegExp 对象,具有指定的模式和标志。如果参数 pattern 是正则表达式而不是字符串,那么 RegExp() 构造函数将用与指定的 RegExp 相同的模式和标志创建一个新的 RegExp 对象。

如果不用 new 运算符,而将 RegExp() 作为函数调用,那么它的行为与用 new 运算符调用时一样,只是当 pattern 是正则表达式时,它只返回 pattern,而不再创建一个新的 RegExp 对象。

抛出

SyntaxError - 如果 pattern 不是合法的正则表达式,或 attributes 含有 "g"、"i" 和 "m" 之外的字符,抛出该异常。

TypeError - 如果 pattern 是 RegExp 对象,但没有省略 attributes 参数,抛出该异常。

修饰符

修饰符 描述
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。

方括号

方括号用于查找某个范围内的字符:

表达式 描述
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。
[adgk] 查找给定集合内的任何字符。
[^adgk] 查找给定集合外的任何字符。
(red|blue|green) 查找任何指定的选项。

元字符

元字符(Metacharacter)是拥有特殊含义的字符:

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

量词

量词 描述
n+ 匹配任何包含至少一个 n 的字符串。
n* 匹配任何包含零个或多个 n 的字符串。
n? 匹配任何包含零个或一个 n 的字符串。
n{X} 匹配包含 X 个 n 的序列的字符串。
n{X,Y} 匹配包含 X 或 Y 个 n 的序列的字符串。
n{X,} 匹配包含至少 X 个 n 的序列的字符串。
n$ 匹配任何结尾为 n 的字符串。
^n 匹配任何开头为 n 的字符串。
?=n 匹配任何其后紧接指定字符串 n 的字符串。
?!n 匹配任何其后没有紧接指定字符串 n 的字符串。

RegExp 对象属性

属性 描述 FF IE
global RegExp 对象是否具有标志 g。 1 4
ignoreCase RegExp 对象是否具有标志 i。 1 4
lastIndex 一个整数,标示开始下一次匹配的字符位置。 1 4
multiline RegExp 对象是否具有标志 m。 1 4
source 正则表达式的源文本。 1 4

RegExp 对象方法

方法 描述 FF IE
compile 编译正则表达式。 1 4
exec 检索字符串中指定的值。返回找到的值,并确定其位置。 1 4
test 检索字符串中指定的值。返回 true 或 false。 1 4

支持正则表达式的 String 对象的方法

方法 描述 FF IE
search 检索与正则表达式相匹配的值。 1 4
match 找到一个或多个正则表达式的匹配。 1 4
replace 替换与正则表达式匹配的子串。 1 4
split 把字符串分割为字符串数组。 1 4

 var str = "L.Rain"; 
  str = str.replace(/[R|n]/g , "*"); <==> new RegExp("[R|n]","gi")

  RegExp 类。RegExp对象的构造函数可以带一个或两个参数.第一个参数是描述需要进行匹配的模式字符串;如果有第二个参数,这个参数则指定了额外的处理指令.
  最基本的正则表达式就是普通的字符串.
  var reCat = new RegExp("cat");  <==>  var reCat = /cat/;
  var reCat = new RegExp("cat","g"); 第二个参数表示要搜索字符串出现的全部的"cat",而不是找到第一个匹配后就停止。如果还要模式不区分大小写
  ,可以给第二个参数添加字符 i     var reCat = new RegExp("cat","gi");  <==> var reCat = /cat/gi;
  测试: var sToMatch = "cat";
          var reCat = /cat/gi;
          alert( reCat.test(sToMatch) );
  exec():访问模式的每一次出现
              var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
              var reAt = /at/;
              var arrMatches = reAt.exec(sToMatch);
              alert( arrMatches.length );   // output  1
  match(): String 对象的 match()  方法
              var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
              var reAt = /at/gi;
              var arrMatches = sToMatch.match(reAt);
              alert( arrMatches.length );   // output  6
  search() : 此方法与 indexOf()方法类似,但是它使用的是一个    RegExp 对象 而并非一个字符串 ,返回的是字符串中一个匹配的位置。(g)全局匹配在此
  方法不起作用。
  replace():可以用另外一个字符串(第二个参数) 来代替某一个字符串 或者 一个匹配的模式字符串 (第一个参数) 的所有匹配
  split(): 参数 可以为一个字符串 也可以为 一个 匹配的模式字符串 RegExp 对象


  /****************************/

  元字符,字符类和量词等都是正则表达式语法中非常重要的部分。

  元字符: (  [  {  \  ^   $  |  )   ?  *  +  任何时候要使用这些元字符 ,都必须对它们进行转义。因此

      var reQMark =/\?/ ;
      <==>
      var reQMark = new RegExp("\\?");  注意此处为 \\   Javascript高级程序设计 P170

      使用特殊字符: \t     \n (换行符)     \r (回车符)    \f    \a   \e    \cX    \b    \v    \0 (空字符)
                  var sNewString = sStringnewlines.replace(/\n/g,"")
                  如果通过  RegExp  构造函数来使用它们 , 则都必须进行双重转义.
        字符类: 简单类 : 是用于测试的字符的组合.通过将一些字符放入括号中。 例如要匹配字符a,b,c应该为[abc], 这个称之为简单类。
   var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
   var reBatCatRat =/[bcf]at/gi;
   var arrMatches = sToMatch.match(reBatCatRat);
   document.write(arrMatches);   //bat,Cat,fAt,baT,faT,cat
   负向类 : 除了特定的一些,你可能会要匹配所有的字符, 则可以使用负向类。 例如要匹配除了a和b的所有字符,那么应该为[^ab]
   var sToMatch = "a bat , a Cat , a fAt ,a baT , a faT cat";
   var reBatCatRat =/[^bc]at/gi;
   var arrMatches = sToMatch.match(reBatCatRat);
   document.write(arrMatches);   //fAt,faT
   范围类 :  要匹配所有的字母表中的字符,但是又实在不想逐个输入。 例如指定从a到z之间范围:[a-z]。那条横线可看作为"从什么到什么"
   组合类 : 是由几种其他的类组合而成的字符类.例如 假设要匹配所有的从a~m的字母以及从1~4的数字,以及以个换行符。
                    [a-m1-4\n] 注意 不要有空格。
                    在 ECMAScript 不支持联合类和交叉类 如:[a-m[p-z]  [a-m[^b-e]]之间的模式出现
   预定义类 :   .  <=>  [^\n\r]   除了换行符和回车之外的任意字符
               \d  <=>  [0-9]     任意数字
               \D     <=>  [^0-9]    非数字字符
               \s  <=>     [\t\n\x0B\f\r]  空白字符
               \S  <=>     [^\t\n\x0B\f\r]  非空白字符
               \w  <=>  [a-zA-Z_0-9]     单词字符(所有的字母,数字,下划线)
               \W  <=>  [^a-zA-Z_0-9]    非单词字符
         量词 : 可以指定某个特定模式出现的次数
      ?      出现0或1次
      *         出现0或多次
      +         出现1次或多次   最少一次
      {n}    一定出现n次
      {n,m}  至少出现 n 次 但不超过 m次
      {n,}   至少出现 n 次
复杂模式
分组:
 var reg = /[.]*?play-(.*?)\.html$/;
var str = "http://www.openv.com/zj/zj_play-sport_2008_2017.html";
reg.test(str);
document.write(RegExp.$1);     //output sport_2008_2017

贪婪、惰性 和 支配性 (目前IE.Opera不支持)的量词  ☆
贪婪量词: 先看整个的字符串是否匹配.如果没有发现匹配的,它去掉该字符串的最后一个字符,并再次尝试。如果还没有发现匹配,那么再次去掉最后一个字符
这个过程一直重复直到发现一个匹配或者字符串不剩任何字符。
惰性量词: 先看字符串的第一个字母是否匹配。如果单独这一个字符还不够,就读入下一个字符, 组成两个字符的字符串.如果还没有匹配,惰性量词将继续从
字符串中添加字符直到发现匹配或整个字符串都检查过也没有匹配。刚好与贪婪量词相反。
支配量词:只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步的尝试。支配量词就是一刀切,
贪婪: ?      *       +
惰性: ??     *?      +?
支配: ?+     *+      ++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiangyong58

喝杯茶还能肝到天亮,共同进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值