亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正則匹配日期,請高手給翻譯一下這條正則什么含義?

正則匹配日期,請高手給翻譯一下這條正則什么含義?

森林海 2018-12-20 18:19:21
在http://www.jb51.net/article/2...網站上看到匹配日期的一個正則,表示很疑惑,沒看懂,請高手指點。^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$ 匹配結果如下:1, ?:是什么意思?2, ?! 是什么意思?
查看完整描述

1 回答

?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

首先你這個例子中的匹配表達式也太長了,匹配個日期根本不需要這么麻煩,不建議糾結這個表達式,可以找到更好的正則寫法,我就你的兩點問題做一個回答吧。
1.簡單來說,(?:)就是為了分組,但是不捕獲下來供正則表達式其他部分使用,就是說不能使用\1\2這種捕獲的子模式。
舉個例子

var pattern1=/aacdaa/;

var pattern2=/(?:aa|bb)cd\1/;

var pattern3=/(aa|bb)cd\1/;


var str="aacdaa";

console.log(str.match(pattern1)); // ["aacdaa", index: 0, input: "aacdaa"]

console.log(str.match(pattern2)); // null

console.log(str.match(pattern3)); // ["aacdaa", "aa", index: 0, input: "aacdaa"]

第一個匹配到了,沒問題,普通的匹配

第二個就沒匹配到,因為\1在這里無法識別,是非獲取匹配

第三個就匹配到了,因為()是獲取性匹配,看后面的輸出 數組中第二項是aa,匹配了這個子模式,可以供后續使用,后面的\1就是匹配到的子模式aa。


所以說(?:)的作用就是為了分組,它和()的區別在上面這個例子中已經表現出來了,至于它和普通模式的區別,就體現在分組的便利上。

上面的例子改一下:


var pattern4=/aacd|bbcd/;

var pattern5=/(?:aa|bb)cd/;

兩種寫法是一樣的匹配模式,但是用了分組之后,簡潔了不少,這就是非獲取匹配的最常用的作用


2.(?!p)是負向先行斷言,意思是要求接下來的字符不與p表達式匹配,,還有一個(?=p)也一塊說了吧,這個正好和?!相反,稱為正向先行斷言,要求接下來的字符與p表達式匹配。也就是說這里的(?:)和(?!)起的就是一個條件作用,用來判斷前面的表達式滿足不滿足p這個條件,只有滿足了才匹配,不滿足就不匹配。

同樣用上面類似的例子來說明:


var pattern6=/aa(?=cd)/;

var pattern7=/aa(?!cd)/;

var s1="aacd";

var s2="aabb";

console.log(s1.match(pattern6),s1.match(pattern7));//["aa", index: 0, input: "aacd"] , null

console.log(s2.match(pattern6),s2.match(pattern7));//null , ["aa", index: 0, input: "aabb"]

s1匹配了pattern6,因為s1中的aa后面接著的是cd,s2匹配了pattern7,因為s1中的aa后面接著的不是cd。


查看完整回答
反對 回復 2019-01-03
  • 1 回答
  • 0 關注
  • 427 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號