同じコードを試してもかまいませんが、$と^は正規表現の単語境界\b
に置き換えてください。コードは次のようになります。
(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})(?=\W)|\b(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])?|(?:(?:16|[2468][048]|[3579][26])00)?)))(?=\W)|\b(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))(\4)?(?:(?:1[6-9]|[2-9]\d)?\d{2})?(?=\b)
を上記のコードは一致します。
30/04/2016
31/05/2016
しかし、それはしませんが一致:
31/04/2016
32/05/2016
、それはそれの前/後の文字列を持っている任意の日付と一致します:
ABCDE を2016年11月27日
デモ:https://regex101.com/r/Hs2sjW/5
更新:
前のコードにはいくつか問題がある可能性があります。これを行う最善の方法は、最初に日付パターンをチェックしてから、日付の有効性をチェックすることです。次に、あなたの正規表現で日付の有効性を確認
\d{2}[-.\/]\d{2}(?:[-.\/]\d{2}(\d{2})?)?
:日付パターンを確認する最初の正規表現は、このようなものである可能性があります。ここで働くのjavascriptです:
var myString = "Test 22/10/20 Test"; //Could be any String
var myRegexp = /\d{2}[-.\/]\d{2}(?:[-.\/]\d{2}(\d{2})?)?/g; //Check pattern only
var validDate = /(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])?|(?:(?:16|[2468][048]|[3579][26])00)?)))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))(\4)?(?:(?:1[6-9]|[2-9]\d)?\d{2})?$/g; //Check the validity of the date
myString = myRegexp.exec(myString)
myString = validDate.exec(myString[0])
console.log(myString[0])
は27-11-2016またはちょうど2016年11月27日に似た日付と一致するようにしようとしていますか? – Ibrahim
これを読む:http://stackoverflow.com/questions/5978510/regex-to-match-date – MYGz