LoginSignup
93
78

JavaScriptで平仮名(ひらがな)を判定する

Last updated at Posted at 2023-01-05

正規表現を使い、文字列が平仮名か否かを判定します。
以下のように判定できることを目指します。

regex = /*ここに何らかの正規表現*/;
regex.test("あいうえお");
// -> true
regex.test("あぁ");
// -> true
regex.test("aiueo");
// -> false
regex.test("あいueo");
// -> false
regex.test("あい うえお");
// -> false

3つの方法を紹介します。

  1. Unicodeプロパティを使う
  2. Unicodeエスケープシーケンスを使う
  3. 平仮名を使う

注意事項や、コメント欄もお読みください。

1. Unicodeプロパティを使う

これが最もスマートです。
現在では殆どの環境でUnicodeプロパティをサポートしているので、気にせず使えます。ええ時代や。

regex = /^[\p{scx=Hiragana}]+$/u;

↑だけであれば、[ ]は省略できます。

regex = /^\p{scx=Hiragana}+$/u;

ちなみに、この方法では鍵括弧や句読点にもマッチしてしまいます。
注意事項をご参照ください。

参考: UNICODE REGULAR EXPRESSIONS - Unicode® Technical Standard

2. Unicodeエスケープシーケンスを使う

Unicodeにおける平仮名の範囲はU+3041-U+3093ですので、以下のようになります。

regex = /^[\u3041-\u3093]+$/u;

3. 平仮名を使う

Shift-JISでもUTF-8でも、平仮名の範囲は-ですので、そのまま[ぁ-ん]とする方法です。
旧石器時代から使われています。直感的ですわぁ〜ん

regex = /^[ぁ-ん]+$/u;

注意事項(@nanto_viさんのコメントより引用)

1. Unicodeプロパティを使うのマッチングについて

また、\p{scx=Hiragana}だと鍵括弧や句読点にもマッチするので、用途によってはscx(Script_Extensionsプロパティ)ではなくsc(Scriptプロパティ)を使って[\p{sc=Hiragana}ー](「ひらがな」文字体系および長音符)くらいが適しているかもしれません。

2. Unicodeエスケープシーケンスを使うおよび、
3. 平仮名を使うのマッチングについて

また、[\u3041-\u3093]でも[ぁ-ん]でも「ゔ」などの文字が含まれないので、用途によってはそうした文字を含めるようにしてもよいかもしれません。

まとめ

Unicodeプロパティ最強。
scx=Katakanaとすればカタカナを指定できたりと、つよつよすぎてこれしか使えない体にされてしまいました。
しかし、現在でも3.の方法で学ぶことが多いようです。

Unicodeプロパティの便利さが世に広がるといいな。

参考:
[正規表現] Unicode 文字プロパティ (01) -- 概要 - @hachi8833 さんの記事
JavaScriptで扱えるUnicodeプロパティ一覧 - @BlueSilverCat さんの記事

Special Thanks - 謝辞

順不同

@nanto_viさん
いただきましたコメントを参考に、記事の内容や、表現を一部編集させていただきました。
大変有益なコメント/ご指摘、ありがとうございます!

@jack-lowさん
タイポのご指摘ありがとうございます!

93
78
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
93
78