0

ラトビア市民の個人コードの正規表現 ( php / js ) の記述に問題があります。ラトビアのすべての市民は、独自の個人コードを持っています。フォーマットは 11 桁で、6 桁目以降にダッシュがあります。つまり、最初の 6 桁が生年月日です。

ddmmyy (例: 130589 ) は、ダッシュ ( - ) に続き、7 桁目に移動します。これは、世紀を意味する 0、1、または 2 (0 は 19 世紀、2 は 21 世紀) で、0000 から 0000 までの数字になります。 9999

例:

080189-12602

08   - day
01   - month
89   - year
-    - dash
1    - 20th century
2602 - random 4 digit combination.

質問は、誰かが正規表現を書くのを手伝ってくれますか?

4

4 に答える 4

3

正規表現で日付を検証しないことをお勧めします。代わりに、正しい形式のみを確認してください。

/^(\d{6})-[012]\d{4}$/

これは、任意の 6 桁の数字、ダッシュ、次に から0までの数字2、さらに任意の 4 桁の数字に一致します。1その後、有効な日付を確認できるキャプチャ グループ番号に日付部分が表示されます。または、日、月、年を別々に抽出することもできます。

/^(\d{2})(\d{2})(\d{2})-[012]\d{4}$/

今では、日がキャプチャされ1、月がキャプチャされ2、年がキャプチャされ3ます。日付範囲の検証は、理論的には正規表現で行うことができますが、実際には推奨されません (正規表現は非常に肥大化して維持できなくなります)。そのため、数字があることを確認してから、プログラミング言語 (PHP または JS) を使用して、指定された数字が有効な日付を形成することを確認できます。

于 2012-11-30T19:01:42.093 に答える
1
^(0[1-9]|[12][0-9]|3[01])(0[1-9]|1[012])(\d{2})-(0|1|2)(\d{4})$
  • ^- 文字列の先頭
  • (0[1-9]|[12][0-9]|3[01])01-09、10-29、30 または 31 (日)
  • (0[1-9]|1[012])01 ~ 09、10、11、または 12 (月)
  • (\d{2})任意の 2 桁 (年)
  • -ダッシュ
  • (0|1|2)0、1、または 2 (世紀の桁)
  • (\d{4})任意の 4 桁

http://regexr.com?330dj

これは、2 月 31 日などの無効な日付の一部のケースを処理しないことに注意してください。これは、正規表現だけでは基本的に不可能です。

于 2012-11-30T19:05:41.563 に答える
0

これは正規表現ではなく、最も美しいコードでもありませんが、次のコードを使用して ID からすべてのビットを取得できます。

<?php
$input = '080189-12602';
$id_arr = explode('-', $input);
list($day, $month, $year) = str_split($id_arr[0], 2);

$arr = str_split($id_arr[1]);
$century = 18 + $arr[0];
$id = implode('', array_slice($arr, -4));

printf("%s -> %s%s/%s/%s-%s", $input, $century, $year, $month, $day, $id);
//output: 080189-12602 -> 1989/01/08-2602

日付の奇抜さを考えると、正規表現で日付を検証することはおそらくお勧めできません。例: 2 月 29 日が有効な日付かどうかを教えてくれるものを書いてみてください。入力を切り刻み、すべてのチェックが既に実装されている日付ライブラリで実行することをお勧めします。

于 2012-11-30T19:09:46.977 に答える
0
^[0-3][0-9][01][0-9][0-9][0-9]-[012][0-9][0-9][0-9][0-9]$

日 (最大 39); 月 (最大 19); 00 年から 99 年。世紀、および 4 桁。

これはかなり一般的な正規表現です。他にもたくさんの書き方があります。それらのいくつかはより明確である可能性があり、いくつかはより高速である可能性があります. 次のような表記法を使用して、範囲をより正確にすることができます。

([012][0-9]|3[01])

これは、月の日の 31 までの値のみを受け入れます。ただし、それでも 2 月 31 日を拒否する必要があります。これは、正規表現でエンコードしようとするものではありません (実行できることは間違いありません。試したくないだけです)。

于 2012-11-30T19:00:55.377 に答える