正则表达式,?<= 和 ?= 的用法

正则表达式,?<= 和 ?= 的用法。

本文主要记录实现:指定字符开头,和指定字符结尾的中间字符串。
能够实现上述功能的就是 ?<= 和 ?= 表达式。举个例子来说:

我要查找 html 标签中的 href 地址,网页的源代码如下:

  1. <a href="wwww.weijian21.top">微见博客</a>

通过下面的正则表达式就能够正确匹配到 wwww.weijian21.top

  1. (?<=(href=")).{1,200}(?=(">))

分来开分析,该正则表达式的含义:

  1. 1. (?<=(href=")>)意思就是以 href=" 开头的字符串
  2. 2. .{1,200} 一般网址都是 200长度了,这其实已经很长了
  3. 3. (?=(">)) 意思:以 "> 结尾的字符串。

其实这里说:以 href=” 开头的 或者 “> 结尾的字符串,个人认为是容易形成误解的。
因为: ^$ 表示字符串的开头和结尾,而且是包含开头和结尾的。个人更能理解的表述方式为:href=” 后面 和 “> 前面的字符串,当然这就不包含 href=”“>本身了。

这其实是正则表达式的位置指定:

  1. (?=exp) 匹配exp前面的位置
  2. (?<=exp) 匹配exp后面的位置
  3. (?!exp) 匹配后面跟的不是exp的位置
  4. (?<!exp) 匹配前面不是exp的位置

记录一下比较难以书写的正则表达式:
至少6个字符,并且至少一个字母和一个数字:

  1. /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,}$/

至少6个字符,至少一个字母,一个数字和一个特殊字符:

  1. /^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{6,}$/

. 表示除了换行符之外的所有字符。

* 表示匹配 前面的表达式 0 次或者 多次

正则表达式中的贪婪模式和非贪婪模式

正则表达式默认是贪婪匹配的,也就是说:他是尽可能大的匹配到对应的字符串
比如:

. 表示单个字符匹配任意多次 贪婪模式
? 表示单个字符匹配一次, 非贪婪模式

  1. a.*b

读如下字符串进行匹配:
aabab 将会匹配到整个字符串。 这就是贪婪匹配

但是有时候我们需要非贪婪匹配。也就是尽可能少的匹配,只要符合规则,只需要在后面加上一个 ? 就可以

  1. a.*?b

用同样的字符串进行匹配 aabab 将会匹配到 aab和ab

  1. *? 重复任意次,但尽可能少重复
  2. +? 重复1次或更多次,但尽可能少重复
  3. ?? 重复0次或1次,但尽可能少重复
  4. {n,m} 重复nm次,但尽可能少重复
  5. {n,}? 重复n次以上,但尽可能少重复