September 27, 2025

Unicode Propertyを使って簡単に正規表現を書く

先日会社でUnicode Propertyを使っている例を見たのでどんな言語で使えるのか調べてみました。

JavaScript/TypeScriptでの使い方

ES2018以降、JavaScript/TypeScriptではUnicodeプロパティエスケープ(\p{...})が使えます。uフラグを付けることで、Unicodeプロパティを利用した正規表現が書けます。

例えば、ひらがなのみで構成されているか判定するには:

const hiragana = /^[\p{scx=Hiragana}]+$/u;
console.log(hiragana.test("こんにちは")); // true
console.log(hiragana.test("コンニチハ")); // false
console.log(hiragana.test("こんにちは こんばんは")); // false スペースが混ざるとfalse

カタカナのみの場合:

const katakana = /^[\p{scx=Katakana}]+$/u;
console.log(katakana.test("コンニチハ")); // true
console.log(katakana.test("こんにちは")); // false
console.log(katakana.test("コンニチハ サヨウナラ")); // false スペースが混ざるとfalse

漢字のみの場合:

const kanji = /^[\p{scx=Han}]+$/u;
console.log(kanji.test("漢字")); // true
console.log(kanji.test("漢字テスト")); // false
console.log(kanji.test("漢字 テスト")); // false スペースが混ざるとfalse

TypeScriptでも同様に利用可能です。

他言語での利用例

Python

Pythonは regexモジュール(標準のreではなく、外部パッケージ)でUnicodeプロパティが使えます。

import regex
pattern = r'\p{Script=Hiragana}+'
print(regex.match(pattern, 'こんにちは')) 

Ruby

RubyもUnicodeプロパティをサポートしています。

puts 'こんにちは'.match?(/\p{hiragana}+/)

Kotlin(JVM)

Kotlin(JVM)では、Javaに用意された Unicode Block を使うと、似たような書き方ができます。

val hiragana = Regex("^[\\p{InHiragana}]+")
val katakana = Regex("^[\\p{InKatakana}]+")
println(hiragana.matches("こんにちは")) // true
println(katakana.matches("コンニチハ")) // true

Dart

DartやUnicode propertyがサポートされていない言語では、Unicodeのコードポイント範囲を直接指定する必要があります。 生の正規表現を書くときの普通の書き方ですね。

final hiragana = RegExp(r'^[\u3040-\u309F]+'); // RegExp(r'[ぁ-んー]+')
final katakana = RegExp(r'^[\u30A0-\u30FF]+'); // RegExp(r'[ァ-ヶー]+')
print(hiragana.hasMatch('こんにちは')); // true
print(katakana.hasMatch('コンニチハ')); // true

まとめ

最近はDartを使うことが多いので、愚直に RegExp(r'[ァ-ヶー]+') こんなかんじで書いていますが、他言語だとUnicode propertyを使って便利に書けるのが羨ましくなりました。 調べてみると意外と主要な言語は同様の機能をサポートしていました。 よく思い出してみればKotlinでも似たようなのが使えたので、Dartも対応が望まれます。

普段からTypeScriptやPythonなどを使っている人は活用していきたいですね。

© AAkira 2023