JavaScript中的正则表达式对象4--重复匹配

  目前为止我们所学的正则表达式只能匹配固定长度的字符串,而且必须顺序写下每一个字符的匹配模式。如匹配4由A或a组成的字符串的正则表达式我们写成[Aa][Aa][Aa][Aa],匹配字母开头后接4个数字的正则表达式写成[A-Za-z][0-9][0-9][0-9][0-9]或者[A-Za-z]\d\d\d\d。
  这里存在一个问题,如果匹配的字符串很长这样写起来就未免太过冗长,更有甚者,一些实际中需要匹配的非固定长度的匹配模式使用现有的方法无法实现。如匹配一个英文单词,英文单词是由大写或小写字母开头后接0个或多个小写字母或者连词符-的一个字符串,用现在的方法根本无法写出一个匹配这样模式的正则表达式,所以在正则表达式中引入了重复匹配的概念。
  正则表达式中规定单个匹配模式后加“+”表示前面这个模式重复匹配1次或者更多次,加“*”表示重复0次或者更多次,加?表示重复0次或者1次。那么我们现在来看看前面无法解决的英文单词问题。首先英文单词以大写或者小写字母开始,我们可以写成[A-Za-z]。首字母后接0个或者多个小写字母或连词符可以写成[A-Za-z][a-z\-]*。(\-是-的转义表达方式,因为-在正则表达式中有特殊含义,所以要表示-自身的时候必须用\-转义)。让我们在JavaScript中测试一下。

var word = /[A-Za-z][a-z\-]*/g;
var str ="abc Abc ABC Abc-abc Abc-";
console.log(str.match(word));//["abc", "Abc", "A", "B", "C", "Abc-abc", "Abc-"]

从结果中我们发现最后一个匹配的单词是“Abc-”,连词符出现在单词末尾的情况不符合一般英文单词的写法,如何避免这种情况呢?我们可以将单词分成3部分词首、连接词前半部分、连词符加连词符后半部分,则表达式可以写成[A-Za-z][a-z]*(\-[a-z]+)?测试结果如下。

var word = /[A-Za-z][a-z]*(\-[a-z]+)?/g;
var str ="abc Abc ABC Abc-abc Abc-";
console.log(str.match(word));//["abc", "Abc", "A", "B", "C", "Abc-abc", "Abc"]

  可以看出正则表达式中的*+?非常强大,可以解决很多实际问题。但是仍然有一些实际匹配是针对固定宽度或者有确切范围的宽度,比如匹配这样的日期字符串“2016-12-10”我们可以写成\d\d\d\d-\d\d-\d\d,这就是匹配固定宽度的例子,当然这里固定宽度很小只有4个字符我们直接列举出来也没有什么问题,但是如果这个宽度是100那么在用列举的办法显然不合适。所以正则表达式中引入了表示精确重复次数的元字符{n},里面的n表示重复的次数,那么日期的正则表达式可以改写成\d{4}-\d{2}-\d{2},这样的写法更简洁更易读。那么如何表示匹配宽度的范围呢,还是日期的例子“2016-12-1”这是一个合法的日期写法,但是前面的日期正则表达式不会匹配它,因为最后一个天数只有1位字符,但是表达式明确要求匹配2次数字。仔细分析一下可以看出日期和月份的宽度可以是1位也可以是2位,在正则表达式中使用{n,m}表示匹配重复的范围,那么更精准的日期正则表达式的写法就是\d{4}-\d{1,2}-\d{1,2}。

小结
- 至少匹配1次 +
- 至多匹配1次 ?
- 可以匹配任意次 *
- 匹配固定次数 {n}
- 匹配次数在某个区间{n,m}
- 至少匹配n次{n,}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值