您的位置:首页 > Web前端 > JavaScript

正则表达式某些元字符的理解,基于js

2017-11-02 10:30 148 查看
正则表达式的字符描述,网上一搜一大堆,但是由于只有描述而没有具体例子,让人感觉还是有些模糊。

于是,我整理了一些比较不容易理解的字符的具体例子,加深理解。

先打个基础吧:

正则表达式中的元字符可以分为两种:匹配位置和匹配字符的元字符。

匹配位置的元字符:顾名思义就是设定要匹配的字符串的位置,匹配的是一个位置而不是一个字符。包括3种:^、$、\b。

匹配字符的元字符:通常只能匹配字符串集合中的一个字符。包括:. 、\w、\W、\s、\S、\d、\D  这7种。

( ):用于分组,分组又称子表达式。分组后将()内的表达式看做一个整体。也就是如果后接下面的限定符,即可对整个()内匹配多次。

(exp)这种形式又称捕获,即匹配exp,并捕获文本到自动命名的组里


另外,当被分组后,每个组自动有一个组号(从1开始)。该组号代表该组的表达式。\分组号  表示引用该分组。

如(\d)\d\1 这里的"\1"就是对"(\d)"的后向引用。



[  ]:表示一个字符组(有的书上写字符类),表示匹配方括号中的任意一个。也就是只占一个字符的位置。

{n}表示重复匹配n次、{n,}至少匹配n次、{n,m}表示匹配n到m次

限定符:上面说过元字符只能匹配一个位置或一个字符,要匹配多次需要用限定符。也就是说限定符可以指定特定字符或字符集匹配多少次。

包括但不限于:{n}、{n,}、{n,m}、+、?、*等等。

注意:只指定前面的一个字符(能占一个字符位的比如上面的匹配字符的元字符或者有实际意义的字符(数字、字母等等))

或者字符集(即上面的分组()中的内容)。



1、^  

用法1:匹配输入的开始。如果多行标志被设置为true,那么也匹配换行符后紧跟的位置。

换句话说,只有在最开始(索引为0)搜索到匹配项才算,而[1]以后搜索到就不行。

例如:^string
  表示匹配以string开头的行。

js例子如下:

var p=/^a/g;
p.test('apple');  //true
p.exec('parent');  //false


用法2:当  ^ 作为第一个字符出现在一个字符集合模式时,表示反义。

即:[^]表示不包含,默认是一个字符长度。

例如:[^xyz]它匹配任何一个没有包含在方括号中的字符。注意这里[^xyz]只占1位,即除xyz的任意一个字符。

如下:

var l=/[^xyz]/g;
l.exec('apple');  //获得数组["a", index: 0, input: "apple"]
l.exec('apple');  //再次调用得["p", index: 1, input: "apple"]


注:因为var l的是g模式,所以再次调用exec()方法是从前一个被发现的匹配项以后搜索。

2、$

用法:匹配输入的结束。如果多行标示被设置为true,那么也匹配换行符前的位置。

例如,/t$/ 并不会匹配 "eater" 中的 't',但是会匹配 "eat" 中的 't'。

即/string$/表示一定要匹配末尾是string的匹配项

var m=/ple$/g;
m.exec('apple'); //["ple", index: 2, input: "apple"]

3、?

用法1:匹配前面一个表达式0次或者1次。等价于 {0,1}。

例如:colou?r   :  u?表示匹配前一个字符 0到1次。整体表示匹配colour或color。

用法2:在限定符*、+、{}、?后接?,表示非贪婪模式,即尽可能少的匹配。

"*?"   重复任意次,但尽可能少重复 

       如 "acbacb"  正则  "a.*?b" 只会取到第一个"acb" 原本可以全部取到但加了限定符后,只会匹配尽可能少的字符 ,而"acbacb"最少字符的结果就              是"acb" 

"+?"  重复1次或更多次,但尽可能少重复

     与上面一样,只是至少要重复1次

"??" 重复0次或1次,但尽可能少重复

      如 "aaacb" 正则 "a.??b" 只会取到最后的三个字符"acb"

"{n,m}?"  重复n到m次,但尽可能少重复

          如 "aaaaaaaa"  正则 "a{0,m}" 因为最少是0次所以取到结果为空

"{n,}?"    重复n次以上,但尽可能少重复

          如 "aaaaaaa"  正则 "a{1,}" 最少是1次所以取到结果为 "a"

用法3:用于分组中:

(?: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’都不是匹配结果的一部分。

x(?!y) 匹配'x'仅仅当'x'后面不跟着'y',这个叫做正向否定查找。

例如,/\d+(?!\.)/匹配一个数字仅仅当这个数字后面没有跟小数点的时候。正则表达式/\d+(?!\.)/.exec("3.141")匹配‘141’但是不是‘3.141’
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐