単純なフォームの1、2、または3桁の年齢を確認する正規表現コードを書き込もうとしています。3桁の場合、先頭の桁は1である必要があり、先頭の桁が0になることはありません。
私がこれまでに持っているもの:
/^1[0-9][0-9]$|^[0-9][0-9]$|^[0-9]$/
この奇妙な振る舞いの例:
> myRe = /^1[0-9][0-9]$|^[0-9][0-9]$/;
> myRe.exec(023);
["19"]
> myRe.exec(052);
["42"]
単純なフォームの1、2、または3桁の年齢を確認する正規表現コードを書き込もうとしています。3桁の場合、先頭の桁は1である必要があり、先頭の桁が0になることはありません。
私がこれまでに持っているもの:
/^1[0-9][0-9]$|^[0-9][0-9]$|^[0-9]$/
この奇妙な振る舞いの例:
> myRe = /^1[0-9][0-9]$|^[0-9][0-9]$/;
> myRe.exec(023);
["19"]
> myRe.exec(052);
["42"]
023
は数値であり、正規表現は数値では機能しません。そのため、JavaScript は最初に数値を文字列に変換します。ゼロであるため、これは 8 進数です。そう 023 は実際には、そう2 * 8 + 3
ではありません2 * 10 + 3
。
あなたはmyRe.exec("023")
代わりにやりたいです。また、正規表現を変更して、2 桁のブランチの最初の数字と最後のブランチの 1 桁が では[1-9]
なく となるようにすることもでき[0-9]
ます。
数値リテラルを 0 で始めると、8 進数 (基数 8) として解釈されます。したがって、052 (基数 8) は実際には 42 (基数 10) です。次に、文字列 ("42") に変換され、正規表現されます。
あなたの正規表現に関する限り:次のように少し改善します:
/^1[0-9][0-9]$|^[1-9][0-9]$|^[0-9]$/
式では
myRe.exec(023);
023
は 8 進数です。チェックしたいのは文字列です。したがって、引用符で囲みます
/^1?\d{1,2}$/
- そして、これは同じ正規表現の短くて読みやすいバージョンです。
または/^1?\d?\d$/
あなたがもっと好きな方。
数値に対して正規表現を適用しています。RegExps は文字列の引数を想定しています。
したがって:
> myRe = /^1[0-9][0-9]$|^[0-9][0-9]$/;
> myRe.exec('023');
null
> myRe.exec('23');
["23"]
> myRe.exec('052');
null
> myRe.exec('52');
["52"]
予想通り。