先日会社で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などを使っている人は活用していきたいですね。