正则表达式中,(?=.*) (?<=.*) (?<!) (?:) 表达式说明:
(pattern) | 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。 |
(?:pattern) | 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。 |
(?=pattern) | 正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?!pattern) | 正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?<=pattern) | 反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。例如,"(?<=95|98|NT|2000)Windows "能匹配"2000Windows "中的"Windows ",但不能匹配"3.1Windows "中的"Windows "。 |
(?<!pattern) | 反向否定预查,与正向否定预查类似,只是方向相反。例如"(?<!95|98|NT|2000)Windows "能匹配"3.1Windows "中的"Windows ",但不能匹配"2000Windows "中的"Windows "。 |
个人理解:
非获取匹配的意思为,从字符串开始匹配,对于已经匹配过的字符,并不会把让正则表达式把已经匹配部分省略(如,字符串"1a" 能通过表达式 ‘^\d\w$‘,但是它获取了匹配结果,即它第二位必须是英文字母而不能是数字,不能匹配到a1,但是非获取匹配结果针对?=表达式1a和a1都能匹配),现在看一个非获取匹配结果的表达式,
一个验证密码的正则表达式:
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!#$%\-\+\_<>]).+$
它表示能匹配任意字符开头和任意字符结尾的字符串(. 表示匹配任意字符),其中必须包含大小写字母,数字和部分特殊符号(不论先后),就是因为它是非获取匹配的,此处用的 ?= 每匹配一次就会从字符串开始寻找,是否有符合条件的,以括号分隔,不分先后顺序。