正则表达式之 获取匹配与非获取匹配

   最近公司没什么任务,所以学习了一下JS的正则表达式,收获颇多。

举出其中的几个典型表达式分享下。


 正向预查 : (?=pattern)

    正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

 

下面是win7 +IE9 演示的例子

eg:1 

      红色下划线标识的地方 验证此表达式不获取匹配和不消耗字符。

      不获取匹配:图中方框显示的区域  匹配成功后结果只有"windows " ,而没有”2000

      不消耗字符 : 第三个例子和第四个例子可以看出(?=pattern)表达式

 在匹配"windows "后的"2000"完成后    是从"2"开始的而不是从"s"处开始匹配。


                         正则表达式之 获取匹配与非获取匹配
 

 负向预查 :  (?!pattern
        负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始  。                     

 

(?:pattern)
     匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

 

eg:2

             图中列举了 (?=pattern)  与  (?:pattern) 的例子做比较

 

得出结论:(?:pattern)表达式 虽然也是非获取匹配但它是一个消耗字符的匹配。


                            正则表达式之 获取匹配与非获取匹配
 

 

(pattern)
      匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在Visual Basic Scripting Edition 中则使用 $0$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。

 

eg:3  添加i(忽略大小写) g(全局查找),

      在replace 函数的表达式中 添加 ig  对结果没有影响

      在match   函数的表达式中 添加g    则不会获取匹配

      在exec   函数的表达式中 添加 ig  对结果没有影响

    
                       正则表达式之 获取匹配与非获取匹配
                      正则表达式之 获取匹配与非获取匹配
 

 

  ?  问号的用法

     当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。

 
                         正则表达式之 获取匹配与非获取匹配
 
 
 

你可能感兴趣的:(正则表达式)