13

ISO 8601 期間形式で期間を検証するには、正規表現が必要です(必要のない小数部を除いて)。

PnYnMnDTnHnMnS

PnW

ここに私が持っているものがあります:

^P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(\d+H)?(\d+M)?(\d+S)?)?$

唯一の問題は、すべての部分が "zero or one" であるため、この正規表現で文字列Pおよびが許可されることです。PT?

  • 少なくとも 1 つのコンポーネント (日付または時刻) が必要です
  • ある場合はT、時間コンポーネント (H、M、または S) が必要です。
  • ある場合T、日付コンポーネント (Y、M、または D) がある場合とない場合があります。
  • オーバーフローが許可されます (例:P72Hとほぼ同等P3D)

許容される入力:

P1Y        // date component only
P2MT30M    // date and time components
PT6H       // time component only
P5W        // another date component

許容できない入力:

P         // no components
PT        // no components
P3MT      // T specified but not time components

現在、無効な文字列はクライアント側の検証に合格していますが、サーバー側では渡されてDateIntevalいるため失敗していますが、可能であればクライアント側で失敗したいと考えています。誰もが Chrome 40 以降を使用してminlength='3'いる場合は、input 要素で指定して支援することができますが、残念ながらそうではありません。

4

5 に答える 5

23

Pほとんどすべての部分がオプションであるが、 orの後に何か他のものがあることを確認したい場合は、T先読みを利用できます。

^P(?=\d+[YMWD])(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(?=\d+[HMS])(\d+H)?(\d+M)?(\d+S)?)?$
  ^^^^^^^^^^^^                               ^^^^^^^^^^^^

前のパターンの直後に指定されたセットの文字が続く一連の数字が必要です。

デモを見る

アップデート

P「空」にできる場合は、使用します

^P(?!$)(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(?=\d+[HMS])(\d+H)?(\d+M)?(\d+S)?)?$

別のデモを参照してください。ここで、(?!$)文字列が と等しくないことを確認Pし、右側に他の記号が必要です。

または、@UlugbekUmirov が示唆するように、使用するだけで十分T(?=\d)です (すべてのオプション部分が数字で始まるため):

^P(?!$)(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?$

更新 2

数値が浮動小数点数または整数の両方になる場合は、(?:\.\d+)?それぞれの後に を追加します\d+。Update 1 から更新されたパターンを次に示します。

^P(?!$)(\d+(?:\.\d+)?Y)?(\d+(?:\.\d+)?M)?(\d+(?:\.\d+)?W)?(\d+(?:\.\d+)?D)?(T(?=\d)(\d+(?:\.\d+)?H)?(\d+(?:\.\d+)?M)?(\d+(?:\.\d+)?S)?)?$
于 2015-08-17T07:47:00.243 に答える
1

ISO 8601-2:2019(en)に関するこのメッセージによると、負の期間は の前にマイナス記号で表現され、明示的な正の期間はプラス記号で示されるようです。-P+

[-+]?含めるか(-|\+)?前にすると便利ですP

最後に、そのメッセージは、ISO 8601-2:2019(en) からの次の例も示しており、期間の各コンポーネントに負の符号を付けることができることを示しています。

| EXAMPLE 7 '-P2M1D' is equivalent to 'P-2M-1D'.
| EXAMPLE 8 '-P5DT10H' is equivalent to 'P-5DT-10H'.

[-+]?コンポーネントの前に数字を追加-+し、先読みを許可することは、 T8601-2 に準拠する意味があります

^[-+]?P(?!$)(([-+]?\d+Y)|([-+]?\d+\.\d+Y$))?(([-+]?\d+M)|([-+]?\d+\.\d+M$))?(([-+]?\d+W)|([-+]?\d+\.\d+W$))?(([-+]?\d+D)|([-+]?\d+\.\d+D$))?(T(?=[\d+-])(([-+]?\d+H)|([-+]?\d+\.\d+H$))?(([-+]?\d+M)|([-+]?\d+\.\d+M$))?([-+]?\d+(\.\d+)?S)?)??$

于 2021-10-24T06:27:16.777 に答える