旧漢字体
髙橋太郎// 旧漢字の髙
渡邉花子//旧漢字の邉
は一致するような正規表現を検討しております。
旧漢字体を文字クラスで指定すればいいでしょう。
JavaScript
1/[高髙]橋太郎/.test('高橋太郎');
2/[高髙]橋太郎/.test('髙橋太郎');
3/渡[辺邉]花子/.test('渡辺花子');
4/渡[辺邉]花子/.test('渡邉花子');
名前の中で1文字だけ異なっても一致
名前の文字数も含めてその名前の中で1文字だけ異なっても一致するようにさせる正規表現は考えられますでしょうか。
何度もいいますが、「名前」と「名前でない文字」を定義しなければ正規表現は作れません。
そして、あなたが想像しているように完全な方法はないので、あなたがあなたの責任において定義しなければなりません。
あえて、いい加減にかくなら、こうです。
JavaScript
1function takahashi (string) {
2 return /^(?:立候補者の|明日は一緒に行く方は、)(?:.橋太郎|高.太郎|高橋.郎|高橋太.)(?:です!)?$/.test(string);
3}
4
5function watanabe (string) {
6 return /^(?:立候補者の|明日は一緒に行く方は、)(?:.邉花子|渡.花子|渡邉.子|渡邉花.)(?:です!)?$/.test(string);
7}
あなたはおそらく、こう思うでしょう。
「でも、.
は『名前でない文字』にもマッチしてしまいますよね」
その通りですね。
では、『名前でない文字』とは何でしょうか。
あなたはそれを定義できますか。
そして、あなたはこうも思うでしょう。
「"立候補者の~です!" に限らず、前後の文章が何であってもマッチしてほしいんです。」
はい。そうですね。それが理想ですね。
では、前後の文章が何で合ったらマッチせず、何であったらマッチさせたいですか。
「名前でない文字」ならマッチさせず、「名前の一部」ならマッチさせたいですよね。
では、どんな文字が「名前の一部」として扱われたいですか。
名前でない文字の定義はなく区別不能です。
では、「任意の一文字」の表記揺れ対策としては、誤爆を防ぐ方法はありません。
新旧漢字体のリストを作って対応すべきでしょう。
日本の戸籍法における、人名に使用可能な文字
第六十条 戸籍法第五十条第二項の常用平易な文字は、次に掲げるものとする。
一 常用漢字表(平成二十二年内閣告示第二号)に掲げる漢字(括弧書きが添えられているものについては、括弧の外のものに限る。)
二 別表第二に掲げる漢字
三 片仮名又は平仮名(変体仮名を除く。)
まとめると、次のように。
- 漢字 (常用漢字表, 別表第二 に記載されている文字に限る)
- 平仮名 (ひらがな)
- 片仮名 (カタカナ)
日本語の文法
正規表現とは、特定の文法に則った文字列から特定の文字列を検索するものです。
「URL文字列」を抽出するなら、URLの文法規則を知っていなければなりません。
「HTMLタグ」を抽出するなら、HTMLの文法規則を知っていなければなりません。
「人名」を抽出するなら、「人名」の文法規則を知っていなければなりません。
では、人名の文法とは何なのか。
ぐぐれば、戸籍法に則っていることが分かります(前節参照)。
日本の人名に使える文字は「漢字」「ひらがな」「カタカナ」の三種ですが、他に規則性を表すものはありません。
姓名が必要な都合上、フルネームで2文字以上という制約はありますが、それだけです。
日本語は英語と違い、単語の区切りを識別しづらい言語です。例えば、次の日本語を考えてみましょう。
「JavaScript愛を感じます」(JavaScriptへの深い愛情を感じます)
「加藤愛を感じます」(加藤さんへの深い愛情を感じます or 加藤愛さんを感じます)
後者は2つの解釈が成り立ちますが、この文章だけでは判断することは出来ません。
前後の文脈から想像するわけですが、それでも100%正しいとはいえません。
また、「漢字だけで構成される人名」に限り、漢字の連続を名前と見なす事は可能ですが、
「加藤様」(加藤 + 様)
「佐藤殿」(佐藤 + 殿)
このように「敬称」が付くと、「名前」と「敬称」を区別することが出来ません。
「様」「殿」は常用漢字表に載っており、名前に使用される可能性がありますので、末尾にそれがあるからといって、除外することは出来ません。
敬称に限らず、名前の前後に関する漢字が来るケースは他にもあるでしょう。
それに対して完璧に名前以外と判断する術を私は持ちません。
Re: SugiuraY さん