定型文から宛名を自動取得するとき、最初の行や敬称の直前だけを切り出す方法では、「お客様各位」や本文中の「様子」まで宛名として扱うことがあります。抽出条件と拒否条件を対にして設計します。
敬称の前だけを候補にする
文面を正規化した後、「様」「さん」「御中」など既知の敬称が現れる位置を探し、その前の範囲を候補にします。候補は行全体ではなく敬称直前の名前部分に限定します。氏名の内部空白を残し、前後の空白や記号だけを整理します。
function extractAddressee(text) {
const normalized = String(text ?? '').replace(/\r\n?/g, '\n');
const match = normalized.match(/(?:^|\n)\s*([^\n,、。]{1,40}?)\s*(様|さん|御中)(?:[\s,、。]|$)/);
if (!match) return null;
const name = match[1].trim();
if (!name || /^(お客様各位|関係者各位|ご担当者様)$/.test(name)) return null;
if (/様子$/.test(name)) return null;
return name;
}
実際の文面では敬称、句読点、改行の規則に合わせてパターンを絞ります。本文中に出てくる敬称や「様子」のような語尾を名前として拾わないことをテストします。
信頼できないときはフォールバックする
候補が空、一般的な呼びかけ、説明文、複数候補などの場合は、無理に抽出しません。アカウント名など別の信頼できる値を使うか、利用者に確認します。曖昧な値を確定した宛名として表示するより、抽出できなかった状態を返す方が安全です。
入力例を表にして、成功・拒否・フォールバックの期待値をテストします。全角空白、敬称前の空白、複数行、句読点、「様子」のような部分一致を含めます。
まとめ
日本語の宛名抽出は敬称の正規表現だけで完結しません。候補の境界、拒否条件、フォールバックを明示し、純粋関数として例を網羅してテストしましょう。
