動かざることバグの如し

近づきたいよ 君の理想に

新ルールに対応した証券コードの正規表現

環境

  • JavaScript

やりたいこと

2024年1月以降に新規上場した銘柄から、証券コードに英文字が混じるようになった。

従来は「数字4桁」という単純なルールだったので、バリデーションも /^\d{4}$/ で事足りていた。しかし新ルール対応が必要になったので、旧来の数字4桁コードと新しい英数字混在コードの両方にマッチする正規表現が必要となるのでメモ。

コード

まず新しい証券コードのルールを整理する。

www.jpx.co.jp

  • 4桁構成は変わらない
  • 1桁目と3桁目は必ず数字
  • 2桁目と4桁目は「数字」または「英大文字」
  • 英大文字は数字と見間違えやすい B、E、I、O、Q、V、Z の7文字を除いた19文字(A, C, D, F, G, H, J, K, L, M, N, P, R, S, T, U, W, X, Y)のみ使用可

このルールに対応した正規表現がこれだ。

^[1-9][0-9ACDFGHJKLMNPRSTUWXY][0-9][0-9ACDFGHJKLMNPRSTUWXY]$

各パートの意味はこうなる。

  • ^[1-9] : 証券コードは1300番台から始まるため1桁目は1〜9の数字のみ。0始まりは存在しない
  • [0-9ACDFGHJKLMNPRSTUWXY] : 2桁目と4桁目。数字か許可された英大文字のどちらか
  • [0-9] : 3桁目は従来通り必ず数字

JavaScriptで使う場合はこうなる。

const stockCodeRegex = /^[1-9][0-9ACDFGHJKLMNPRSTUWXY][0-9][0-9ACDFGHJKLMNPRSTUWXY]$/;

// 旧来の数字4桁コード
console.log(stockCodeRegex.test('7203')); // true (トヨタ)

// 新形式の英数字混在コード
console.log(stockCodeRegex.test('456A')); // true (HUMAN MADE)

// 無効なコード(禁止文字Iを含む)
console.log(stockCodeRegex.test('2I3C')); // false

なお、証券会社のアプリや検索フォームで小文字入力も受け付けたい場合は i フラグを付けるか、文字クラスに小文字も追加すればいい。

// iフラグで大文字小文字を無視する場合
const stockCodeRegexCI = /^[1-9][0-9ACDFGHJKLMNPRSTUWXY][0-9][0-9ACDFGHJKLMNPRSTUWXY]$/i;

console.log(stockCodeRegexCI.test('2a3c')); // true

参考URL