カタカナの正規表現
小説家をしています。主にライトノベルをターゲットにしています。
JavaScript、JScript、サクラエディタなどを使用しています。
正規表現は実装により差がありますので、ご注意ください。
1.先行実装
まずは先行実装。
/^[ァ-ンー ]+$/
こうなっていますね。確かにJISコード範囲とかだとこんな感じだと思います。
でも最低でも「ヴ」はなくていいのだろうか……。
全角空白が入っていますが、これは処理によって調整してください。
以降はカタカナの単語を抜き出すことを主眼において、全角空白と^
、$
は含めません。
2.とりあえず版
今回はUnicodeでJavaScript、bregonigなどの処理系の話をします。
Wikipediaでも見ましょう。別に「IMEパッド」の「文字一覧」とかでもいいです。
『片仮名_(Unicodeのブロック) - Wikipedia』
https://ja.wikipedia.org/wiki/%E7%89%87%E4%BB%AE%E5%90%8D_(Unicode%E3%81%AE%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF)
Unicode 文字 説明
━━━━━━
30A1 ァ
~ (カタカナが隙間なく並んでいる)
30F3 ン
30F4 ヴ
30F5 ヵ 小書きカ
30F6 ヶ 小書きケ
30F7 ヷ (ワに濁点)
30F8 ヸ (ヰに濁点)
30F9 ヹ (ヱに濁点)
30FA ヺ (ヲに濁点)
30FB ・ 中点
30FC ー 長音記号
(引用者注:英語名は省略した)
先行実装の最後の指摘にあるようにUnicode順では「ン」より後に文字があります。
特に致命的なのが「ヴ」ですね。
ヴァンパイア、ヴァイオリン、ヴァイオレット
こういうのみんなアウトです。
「中点」は「アントニー・ハングマン」みたいな中点です。処理によりますが、カタカナとは言い難いと思います。
この中点、「リストの前に置く点」「ルビ風の点、傍点」「カタカナ以外の単語の列記」などにも使われます。
もう一つの問題は「長音記号」君です。
/[ァ-ヺー]+/
ということでそれらをざっと足してコードブロックを文字で書くならこうですかね。
3.Katakanaプロパティ
JavaScriptはES2018から新機能が使えます。
(もちろんそれより古いJScriptでは使えません)
/\p{Script=Katakana}+/u
サクラエディタ(やMery、Ruby)で使われているbregonigでも同じように使えます。
検索「\p{Katakana}+
」
ところがこの「Katakana
」はUnicodeプロパティなのですが「ー(長音記号)」は入っていないのです。
/[\p{Script=Katakana}ー]+/u
/[\p{sc=Katakana}ー]+/u
検索「[\p{Katakana}ー]+
」
ということで、実用的にするにはこのように足してあげる必要があります。
あぁ、少なくとも、bregonigでは【半角カナ】にもマッチしますので、今回の用途には使えそうもありません。が、面倒な時にはサラッとこれでいいにするのも手です。
参考になりそうな記事を見つけたので、こちらをどうぞ。
4.小書きヵヶ
ところで「30F5ヵ」「30F6ヶ」ってカタカナになってますが、これカタカナですかね?
3ヵ月、二ヵ国、3ヶ月、二ヶ国、霞ヶ浦、桜ヶ丘
こういうのに使うものであって、あまりカタカナとして使う例は知りません。
「ヴ」と違って除外したほうがいい場合もありそうです。
/[ァ-ヴー]+/
/[ァ-ヴヷ-ヺー]+/
アドバンス・カタカナ
5. カナ用繰り返し記号
実はまだ見落としている点があります。
特に筆者は小説家なので、ライトノベルでは稀に実際に遭遇するケースです。
あぁ、「変体仮名」とかアイヌ語とか歴史系は今回はパスします。ややこしすぎるのと、あまり小説で遭遇するパターンがないというのもあります。
30FD ヽ 片仮名繰返し記号
30FE ヾ 片仮名繰返し記号(濁点)
30FF ヿ 「コト」の合略仮名
(引用者注:英語名は省略した)
カンタイ、サゲン、テキ、サヾンクロス、キュウ、クウボ
繰り返し記号は、あんまりいい例が浮かびませんが、使わないけど、使うかもしれません。
6. 濁点、半濁点
実はこれだけでも足りなくてですね……。
『平仮名 (Unicodeのブロック) - Wikipedia』
https://ja.wikipedia.org/wiki/%E5%B9%B3%E4%BB%AE%E5%90%8D_(Unicode%E3%81%AE%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF)
3099 ゙ 濁点(合成用)
309A ゚ 半濁点(合成用)
309B ゛ 濁点
309C ゜ 半濁点
(引用者注:英語名は省略した)
濁点、半濁点ってひらがなとカタカナ共通なんですよね。
ということで、必要ならこれも追加する必要があります。
アシマ中将は攻撃を受け絶叫した。
「ア゛、ア゛ア゛ア゛ア゛ア゛ア゛……」
こういうのは普通にありますね。
アシマ中将は攻撃を受け絶叫した。
「ア゙、ア゙ア゙ア゙ア゙ア゙ア゙……」
(こちらが、合成用版です)
ということでまとめ。
/[ァ-ヺー゛゜\u3099\u309aヽヾヿ]+/
検索「[ァ-ヺー゛゜\u{3099}\u{309a}ヽヾヿ]+
」
(合成用はよく入力段階でおかしくなるのでコードポイントを推奨します)
Katakanaプロパティが細かいところはよく分からない場合は、こんな感じでしょうか。
7. ダブルハイフン
30A0 ゠ ダブルハイフン
(引用者注:英語名は省略した)
ところで、表の一番上にある「ダブルハイフン」これは何かと言いますと、フランス人やドイツ人には名前や名字が2つある人がいます。
日本の規格ではJIS X 0213で追加された記号でもあります。そのため、日本語フォントの一部では実装されています。
そういうときに原語でハイフンで表記されているものを日本語訳したときに使う記号です。
普通に名字と名前を区切るのにも使い人もいます。
ちなみに、多くの場合は普通の「=(全角イコール)」で代用します。
アンナ゠ファシリア・ドンナンテ
こんな感じですね。用途としては「・」に類似しており、「・」を入れるなら「=(全角イコール)」と共に一緒に入れたほうがいいかもしれません。
/[ァ-ヺー゛゜\u3099\u309aヽヾヿ・=゠]+/
8. 「ー」などの位置
厳密にいうなら
あーーストレートパンチを繰り出したぞ。
こういう文の場合「ーーストレートパンチ
」ではなく「ストレートパンチ
」ですよね。
つまり「ー」や「濁点、半濁点」「・=゠」は先頭に来てはならない、という規則があります。
「・=゠」は置いておいて、つまりこうです。
もっと厳密に書くなら濁点が連続しているとおかしいなどもありますが、今回は無視します。
ちなみにこれだと単独の「ー」にもマッチしません。
/[ァ-ヺヿ][ァ-ヺヿー゛゜\u3099\u309a/ヽヾ]*/
検索「[ァ-ヺヿ][ァ-ヺヿー゛゜\u{3099}\u{309a}ヽヾ]*
」
TODO
・「通常使うひらがな」と「最新の漢字」の一覧を表す正規表現の研究。
(終わり)