
明らかに、マイナーの唯一の場所は月の日以降に残り、唯一の可能な区切り文字-数字があります。 そして、一般的な場合、数の制限により、3桁を超える数字を未成年者に割り当てることはできません。たとえば、31日に3桁を追加すると、31999が得られますが、これはまだ32767未満です。
一般に、この「バージョン+マイナー」システムは、1日で作成されたスクリプトのマイナーバージョンに番号を付けるのに十分です。 この場合のバージョンは、ほとんど先頭に付けられたアセンブリ番号ですが、番号付けに重要でないアセンブリを含めないオプションがあります。 これも便利です。マイナーな修正は、日付によって、または極端な場合には、月の日と混在するマイナーによって変わる可能性があります。 残念ながら、未成年者の自然なバージョン番号は正しくソートされなくなりますが、仮想的なソートのために、各日付の終わりに必須の未成年者「00000」を追加しませんか? データベース内または並べ替える場所で、未成年者が未成年者に「00000」が付いていないバージョンを検討する方が簡単です。 タスクを整理しました。行きましょう。
例
古いバージョンの番号を変更せずに、バージョン200を4月1日に更新する必要があると想像してください。 1日で2つのバージョン番号を取得します。
200.2013.4.1
200.2013.4.101
同じ日の次の更新:
200.2013.4.102
そして翌日、日付を変更するだけです:
200.2013.4.2
余分な数字を持たないように、また数字がハードフォーマットに結び付けられていないように、月の日を書くこととは異なるマイナー番号の認識システムを考え出します。 したがって、この例では、マイナー01を1日目 に記録したかどうか、またはマイナー1が10日に記録したかどうかを理解する必要があります。 日付と月の前に0を書き込む可能性を考慮して、先行ゼロが禁止されているChromeだけでなくシステムが動作するようにしてください。 したがって、ビューのバージョンを有効にします
2013.2013.04.01
バージョン行の比較は同時に影響を受けません-唯一のことは、2つのスペルバリアントを混在させることができないことです。バージョン200.2013.04.01と200.2013.04.2は間違った順序になります。 しかし、先行ゼロのないKhromovシステムが主な関心事であるため、ゼロの存在を記録フォーマットのボーナスと見なします。
マイナーバージョンの認識
開発者が日付の後にマイナーバージョンを記述する方法と、日付とバージョンを分離するときにそれをより適切に解釈する方法を見てみましょう。
可能な日付があります:1,2、3、... 31. 01.02、... 09が追加され、この形式の範囲を超えるものはすべて、マイナーバージョン番号のある月の日付と見なされます。
たとえば、32は3日目、マイナーバージョン2です(ただし、解析を簡単にするために、3で始まる数字を認識しませんが、32として定義します。結局、そのような数字はまだデータにありません。ただし、42以上は4番目のマイナー番号として認識されます2)。
156はどういう意味ですか? マイナーバージョンの15番目と6番目のバージョンですか、それとも1番目のバージョンですか? バージョンを文字列として比較するという要件に基づいて、このレコードは15番目の数値であると結論付けます。そうしないと、この例ではバージョンの順序が誤って整列するためです。
1 15 156 //15- , 6- , 1- , 56-
別の比較ルール ( ルール1 )を考え出す方がよいでしょう。 1,2,3で始まる番号-1x、2x、3xではなく、1,2,3として認識される場合、バージョンを比較する前にゼロが埋め込まれます。 その後、日付を区別するためのルールを考え出すことが残っています。 曖昧な場合の未成年者は、日付とゼロで区切られるべきであるというルールとして理解できます。
101 // 1, 0, 1 1001 // 10, 0, 1 111 // 1, 11
1と10を区別するために、最後に0からの日付が常に 0の形式のセパレーターを持つ必要があるというルール( Rule 2 )をもう1つ追加します。 常に2つのゼロが連続して書き込まれます。 これにより、番号付けの一貫性が保たれ、単純な認識ルールが定義されます-日付とバージョンを分離します。
確かに、10日、20日、および30日では、バージョンの数は99を超えることはできません。これは、100100が32767を超えており、10100が1番目の数であるためです。 999以上のバージョン。 ただし、バージョン番号システムのこの制限はそれほど重要ではありません。
また、単純な文字列比較手順には優先順位の競合があることに注意してください。 1日にマイナーを書き始めると、「101」、「1001」、「10234」の形式の行は常に「10」、つまり10番目の数字よりも大きくなります。
4〜9の数字で始まる日付については、競合はまったくなく、区切り記号ゼロを使用する必要はありません(ただし、それらを使用することは禁止されていません)。62、405、435は常に6番目の数字、2番目のバージョン、4- e番号、05番目のバージョンなど 数字32 ...- 39 ...が同じことを考え出すことは可能ですが、これはアイデアとスクリプトの複雑さです。
全体の難しさはあいまいさの中に残っています。301、3002、2145という数字は何ですか? 日付の最後に1つのゼロが存在することは1桁の日付番号を意味し、2つのゼロは2桁の数字を意味することにすでに同意しています。 ゼロのない数値については、文字列比較の理由により、( ルール3 )可能な最大日付が認識されることに同意します。 有効な2桁の日付は、1、2、または3で始まるものと見なされます(そうでない場合は、月とうるう年を分析する必要がありますが、これはテンプレートにとっては複雑ですが、実行可能です)。
人々のためのルール
合計で、マイナーを書くとき、日付1、2、3の2つの非自明なルールを覚えておく必要があります。 日付10、20、30の場合、ゼロの後に別のゼロ(区切り文字)を書き込みます。
他の数字に問題はありません。2134は21.34、20034は20.34です。 必要に応じて、21034を21.34として記述することもできますが、1,2,3,10,20,30の0区切り文字を省略することはできません。
今では、受け取ったルールの正規表現を書き留めておく必要があります。
バージョン、日付、マイナーの認識の正規表現
行の始まりで-すべてが簡単です。
\ d +-古いバージョン
\ d {4}-年
\ d {1,2}-月
日とバージョンを分ける方法は?
([4-9] | [1-3] [1-9])-単純なすべての日の場合。 それらの後-空または先行ゼロ付きのマイナー。 難しいケースが6つ残っています。
[4-9] | [1-3] [1-9] | [1-3] 0?$-バージョンなしのすべて
([1-3])0([1-9] \ d * | $)-最初の3日間
(10 | 20 | 30)0([1-9] \ d * | $)-10、20、30番目
単一の式(区切り点は「\。」の形式で追加され、「\」は文字列の記述規則に従って2倍になります):
rVerMinor = RegExp('(\\d+)\\.' +'(\\d{4})\\.' // JS "\\" - "\" +'(\\d{1,2})\\.' +'(' +'([4-9]|[1-3][1-9]|[1-3]0?$)(\\d*|$)' +'|([1-3])0([1-9]\\d*|$)' +'|(10|20|30)0([1-9]\\d*|$)' +')'); a = s.match(rVerMinor);
jsfiddle.net/spmbt/dk346というテストを実行して実行可能ファイルを作成します。
ここにはネストされた括弧があります。 結果として、月の値の後の括弧内の値を検索するための規則に従って、式内の括弧と同じ数の値が表示されます。 そして、分析後も、それらの中から空でない値を見つけようとする必要があります。 式をより少ない括弧で書き直すことにより、同じ意味を持つ配列位置を結合する方が便利です。
rVerMinor = RegExp('(\\d+)\\.' +'(\\d{4})\\.' +'(\\d{1,2})\\.' +'(' +'([4-9]|[1-3][1-9]|[1-3]0?$)(\\d*|$)' +'|([1-3]|10|20|30)0([1-9]\\d*|$)' // +')');
最後に、先行ゼロのあるケースを排除します:200.2013.4.10001
rVerMinor = RegExp('(\\d+)\\.' +'(\\d{4})\\.' +'(\\d{1,2})\\.' +'(' +'([4-9]|[1-3][1-9]|[1-3]0?$)(\\d*|$)' +'|(10|20|30|[1-3])0+([1-9]\\d*|$)' // +')');
スクリプトを使用して解析する必要がある結果には、2つのオプションがあります。 場所[5]、[6]-区切り文字ゼロのない場合、[7]、[8]-残り。 それらを組み合わせるといいでしょう。 しかし、これまでのところ、日付に先行ゼロが見つかったケースが見つかっています。 これはグーグルには必要ありませんが、グーグルのユニフォームには必要ありません...必要な場所に「0?」を入れ、プラス| 0 [1-3]を書く必要があるときにセパレータなしで出現しました。
rVerMinor = RegExp('(\\d+)\\.' +'(\\d{4})\\.' +'(\\d{1,2})\\.' +'(' +'(0?[4-9]|[1-3][1-9]|0?[1-3]0?$|0[1-3])(\\d*|$)' // 0? |0[1-3] +'|(10|20|30|0?[1-3])0+([1-9]\\d*|$)' //"0?" +')');
先行ゼロが検出されたオプションに該当するという事実は怖いものではありませんが、ゼロを前に持つ数値入力は、後で正しく解析するために8進数であることを覚えておくことが重要です。
テストに合格しました、 jsfiddle.net/spmbt/dk346/1 これですべてが大統一の準備ができました。 両方の式が似ていることがわかりますが、1つの式に結合するには、いくつかのルールを再考する必要があります。 前の構成は機能しますが、JSを書くのが面倒なので、正規表現をもう少し微調整したいと思います。
この一連のルールを作成します。
'('+ // [1-3]0(?=0)'+ //10|20|30, 0 ' |0?[1-3]0$'+ //10|20|30 ' |[1-3][1-9](?!0)'+ //11-31 20,30, . 0 ' |0?[1-9]'+ // 1 9 ')(\\d*|$)' //
必要なすべてのルールを網羅しており、選択肢は1行のみです。 日付とバージョンは常に[4]と[5]に分類されます。 JSはより単純になり、式自体には含まれるサンプル文字列が少なくなります。 セパレーターが0であることが本質的に使用され、すべての場合で2番目の番号に割り当てられました。 テスト: jsfiddle.net/spmbt/dk346/2
結果
JSを終了するために残ります。
var s =['200.2013.04.123','200.2013.04.1002'] ,rVerMinor = RegExp('(\\d+)\\.' +'(\\d{4})\\.' +'(\\d{1,2})\\.' +'([1-3]0(?=0)|0?[1-3]0$|[1-3][1-9](?!0)|0?[1-9])(\\d*|$)'); for(var i =0, iL = s.length; i < iL; i++){ a = s[i].match(rVerMinor); console.log(s[i], a && a.slice(1)) document.body.innerHTML += '<i style=color:#999>'+ s[i] +'</i>' +' =>' +(a &&'<br> v.' + a[1] + (a[5] ?'.'+ a[5].replace(/^0+/,''):'') +', '+ a[2] +'-' +(a[3].length==1?'0':'')+ a[3] +'-'+(a[4].length==1?'0':'') + a[4])+'<br>'; }
バージョンと日付の設計を含む20の例の最終テスト: jsfiddle.net/spmbt/dk346/3
結果 :
テストリスト
200.2013.4.1 =>
v.200, 2013-04-01
200.2013.04.12 =>
v.200, 2013-04-12
200.2013.04.123 =>
v.200.3, 2013-04-12
200.2013.4.103 =>
v.200.3, 2013-04-01
200.2013.4.20 =>
v.200, 2013-04-20
200.2013.4.1053 =>
v.200.53, 2013-04-01
200.2013.4.10253 =>
v.200.253, 2013-04-01
200.2013.4.10001 =>
v.200.1, 2013-04-10
200.2013.4.2003 =>
v.200.3, 2013-04-20
200.2013.4.10015 =>
v.200.15, 2013-04-10
200.2013.4.300199 =>
v.200.199, 2013-04-30
200.2013.4.30199 =>
v.200.199, 2013-04-03
200.2013.4.31199 =>
v.200.199, 2013-04-31
200.2013.4.3199 =>
v.200.99, 2013-04-31
200.2013.4.03 =>
v.200, 2013-04-03
200.2013.4.031 =>
v.200.1, 2013-04-03
200.2013.4.0301 =>
v.200.1, 2013-04-03
200.2013.4.00 =>null
200.2013.12.56 =>
v.200.6, 2013-12-05
200.2013.4.501 =>
v.200.1, 2013-04-05
1行の正規表現:
/(\d+)\.(\d{4})\.(\d{1,2})\.([1-3]0(?=0)|0?[1-3]0$|[1-3][1-9](?!0)|0?[1-9])(\d*|$)/
UPD :正規表現をテストするために、同じ例のバージョンが次の記事のサービスで利用可能です: regexponline.com/s/we#sthash.GpUQK42k.92zmz1RF.dpuf

読者に残るもの
無効な日付、月、日を切り捨てる練習ができます。 バージョンの2つの形式のチェックを行います:日付ありと日付なし(タイプHHH.HHH)。 他のテスト文字列の例の式を確認し、意図したとおりに機能することを確認するか、エラーを見つけます。 プロジェクトで日付形式のプログラムバージョンのレコードを使用します。
* XSLTのページネーション(ページネーション)