私の人生では、フォーマットを使用して要素の正規表現を設定する方法を理解できないようです。
1d 5h 6m 12s
また、次のようなバリエーションを持たせることもできます
1d
1d 1h
1d 1h 1m
1d 1s
6m 12s
etc...
正規表現でその形式のフォーマットを行うことは可能ですか?
私の人生では、フォーマットを使用して要素の正規表現を設定する方法を理解できないようです。
1d 5h 6m 12s
また、次のようなバリエーションを持たせることもできます
1d
1d 1h
1d 1h 1m
1d 1s
6m 12s
etc...
正規表現でその形式のフォーマットを行うことは可能ですか?
注文する必要があると仮定すると、
if (/^\s*(?:(?:[1-9]\d*|0)d\s+)?(?:(?:1?\d|2[0-3])h\s+)?(?:[1-5]?\dm\s+)?(?:[1-5]?\ds)?\s*$/.test(str))
{
// success
}
簡単な内訳は次のとおりです。
^
とはアンカー$
として知られています。それらは文字列の先頭と末尾に一致するため、一部だけでなく文字列全体に一致します。たとえば、そうでなければ合格します。 hello, world! 1d 5h 6m 12s
\s*
andは\s+
、0 個以上の空白文字と 1 個以上の空白文字に一致します。
は(?:[1-9]\d*|0)
任意の桁数に一致しますが、正確にゼロでない限り、ゼロで始まる数字には一致しません。
は(?:1?\d|2[0-3])
、0 から 23 までの数字に一致します。
は[1-5]?\d
、0 から 59 までの数字に一致します。
は、非キャプチャ グループ(?: ... )
と呼ばれます。これらは (グループ化のための) 括弧のようなものですが、単純な括弧が captureであることを除けば、ここでは必要ありません。
は?
、前のエンティティがオプションであることを意味します。
出発点を与えるには:
(\d+d){0,1} //days - not checking for a max
(((([0-1]){0,1}\d)|(2[0-4]))h){0,1} // 24 hours
(((([0-5]){0,1}[0-9])|(60))m){0,1} //60 minutes
(((([0-5]){0,1}[0-9])|(60))s){0,1} //60 seconds
次に、それらをすべてまとめます(この場合、空白の量は気にしません)
(\d+d){0,1}[ ]*(((([0-1]){0,1}\d)|(2[0-4]))h){0,1}[ ]*(((([0-5]){0,1}[0-9])|(60))m){0,1}[ ]*(((([0-5]){0,1}[0-9])|(60))s){0,1}[ ]*
@nhahtdh のコメントからの上記の改良版を含めます。ありがとう!
((\d+)d)? *(([01]?\d|2[0-4])h)? *(([0-5]?\d|60)m)? *(([0-5]?\d|60)s)? *
これがあなたが望むものだと思います:
function parse(s) {
y = s.match(/(?:(\d+)d\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s)?/);
console.log(y);
return y;
}
仕組みは次のとおりです。
(\d+)d\s*
一部の数字の後に がd
続き、その後にオプションの空白が続くものと一致します(?:...)?
、(?:(\d+)d\s*)?
上記がオプションになります。これ?:
により、新しい括弧のセットがキャプチャ グループではなくなります。