#プロローグ
昔々、Twitterと呼ばれる所に、ゆら、もやさん、そしてゆらの取り巻きがおりました。
いつも、ゆらが何かをすれば、取り巻きはこう言います。
「ゆらちゃんかわいい」
そんなある日、もやさんはこう言いました。
「『ゆらちゃんかわいい』と言う人達を懲らしめよう
ゆらは私の物だ。」
それから、彼は取り巻きを懲らしめようとするのでした... (やっているとは言ってない)
#本題
最後のもやさんの一言の前半を私がJavaの正規表現でやります。
参考: http://www.javadrive.jp/regex/
他の言語の正規表現には触れません。
##はじめに
まず、「ゆらちゃんかわいい」(以下A)を2つに分割して考えましょう。
「ゆらちゃん」(以下B)「かわいい」(以下C)とします。
##複雑な日本語
日本語は複雑です。
同じ「あ」でも、「ア」「ア」など、仮名文字だけでもいくつかあります。
同じ読みの漢字には対応しないとして、BとCをこれに対応させましょう。
これを使えば、こうできます。
B=[ゆゅユュユ][らララ][ちチチ][やゃヤャヤャ][んンン]
C=[かカヵカ][わゎワヮワ][いぃイィイ][いぃイィイ]
Cについては、「い」は必ず2連続するので、これを使って短縮します。
C=[かカヵカ][わゎワヮワ][いぃイィイ]{2}
これでいいでしょう。
##言葉の倒置
正規表現は、先頭、末端の指定が無ければ、基本的には前後の関係は文字列として連結すれば合成することができます。
例えば、B+C
であれば、「ユラチャンカワイイ」は100%引っ掛かります。
ですが、こう言ったらどうでしょうか。
「かわいいよゆらちゃん」
倒置されたら難しくなりそうです。
ここで、これとこれを使って、新たにDを定義しましょう。
D=.*
D
は、適当な0文字以上の文字列に引っ掛かります。(つまり無くても引っ掛かります)
これを使えば、先程の倒置はC+D+B
で対応できます。
「ゆらちゃんはかわいい」でも、B+D+C
で対応できます。
##正規表現の合成
最後に、複数の正規表現を一つにまとめましょう。
と思ったら、今度はこんな言い方をする人が現れました。
「ゆらゆらかわいい」
これにも対処しましょう。
「ゆら」自体は既に正規表現を作ってあるので([ゆゅユュユ][らララ]
)、これをBに合成します。
ではどうするのでしょうか
Bの「ちゃん」の部分を「ゆら」でも引っ掛かるようにします。
ここで、候補を使って合成します。
B=[ゆゅユュユ][らララ]([ちチチ][やゃヤャヤャ][んンン]|[ゆゅユュユ][らララ])
できました。
それでは本題に戻りましょう。
B+D+C
とC+D+B
を同時に検索できる正規表現となるよう、先程の方法で合成します。
長くなってしまいますが、こうなります。(以下E)
E=([ゆゅユュユ][らララ]([ちチチ][やゃヤャヤャ][んンン]|[ゆゅユュユ][らララ]).*[かカヵカ][わゎワヮワ][いぃイィイ]{2}|[かカヵカ][わゎワヮワ][いぃイィイ]{2}.*[ゆゅユュユ][らララ]([ちチチ][やゃヤャヤャ][んンン]|[ゆゅユュユ][らララ]))
つよそう
恐らくこれで大体の「ゆらちゃんかわいい」は見つけられるでしょう。多分。
#名前のご協力を頂いた方々
もやさん: Twitter
ゆら: Twitter
ありがとうございます。
#最後に
ゆらちゃんかわいい
文章下手でごめんなさい
後編はこちらへ