javascript - 正規表現で結合されたAM/PMの時間に一致させる
次の形式の入力文字列があります:12:00am|1:20PM|9:30Pm
出力配列として時間の配列が必要です:[12:00am, 1:20PM, 9:30Pm]
しかし、それを正規表現で照合する前に。
私は午前午後の時間にマッチする正規表現を持っていて、完全な文字列にマッチするために | を追加しようとしました \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 にもマッチしてしまい、これは正しくありません。
私の正規表現のどこに間違いがあり、どうすれば期待する配列を返すことができますか。
ありがとう
回答 #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 {
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回以上繰り返されることを検証します。パターンのデモを参照してください。
