2017-05-25 21 views
2

我在接下來的格式輸入字符串:12:00am|1:20PM|9:30Pm比賽加入AMPM小時,正則表達式

我必須像小時輸出數組:[12:00am, 1:20PM, 9:30Pm]

但我shoudl用正則表達式匹配它之前。

我有一些正則表達式來匹配AmPm小時,我試圖添加|來匹配完整字符串 \b((1[0-2]|0?[1-9]):([0-5][0-9])([AaPp][Mm]))([|])?。這個正則表達式匹配字符串12:00am|1:20PM|9:30Pm,但也匹配字符串12:00am|1:20PM}9:30Pm,這是不正確的。

我的錯誤在哪裏是我的正則表達式,我該如何返回預期的數組。

由於

+0

什麼[類似問題](https://stackoverflow.com/questions/44175731/regular-expression-for-5-comma-separated-email-id)。檢查[此評論](https://stackoverflow.com/questions/44175731/regular-expression-for-5-comma-separated-email-id#comment75366499_44175731)。建議用'「|」'分割並檢查所有項是否匹配:^(1 [0-2] | 0?[1-9]):([0-5] [0-9])( [AAPP] [MM])$'。 –

+0

@WiktorStribiżew,謝謝,我會檢查它 – demo

+1

請參閱https://jsfiddle.net/4xmzw5p3/1/。所以,先拆分,然後驗證。它是否符合您的要求? –

回答

1

\b((1[0-2]|0?[1-9]):([0-5][0-9])([AaPp][Mm]))([|])?不需要|[|]?比賽1或0的出現這種炭。這個正則表達式匹配12:00am|1:20PM}9:30Pm,因爲它找到了12:00am並稱它爲一天(即返回有效匹配)。

您需要將字符串拆分爲|,並根據/^(1[0-2]|0?[1-9]):([0-5][0-9])([AaPp][Mm])$/模式驗證每個項目。

var s = "12:00am|1:20PM|9:30Pm"; 
 
var re = /^(1[0-2]|0?[1-9]):[0-5][0-9]([AaPp][Mm])$/; 
 
var items = s.split("|"); 
 
if (items.filter(function(x) { return re.test(x); }).length === items.length) { 
 
    console.log("VALID => ", items); 
 
} else { 
 
\t console.log("INVALID!"); 
 
}

注意,你可以使用正則表達式來預先驗證字符串,但它只是比較繁瑣:

var s = "12:00am|1:20PM|9:30Pm"; 
 
var re_block = "(1[0-2]|0?[1-9]):([0-5][0-9])([AaPp][Mm])"; 
 
var re = new RegExp("^" + re_block + "(?:\\|" + re_block + ")*$"); 
 
var isValid = re.test(s); 
 
console.log(isValid ? s.split("|") : "Invalid!");

正則表達式會看如/^(1[0-2]|0?[1-9]):([0-5][0-9])([AaPp][Mm])(?:\|(1[0-2]|0?[1-9]):([0-5][0-9])([AaPp][Mm]))*$/,它將驗證以時間開始的字符串子串,然後有0個或更多的時間子字符串出現到字符串結尾。請參閱pattern demo