住所に含まれる色んな横棒をぜんぶ半角ハイフンに変える

最近グーグルスプレッドシートで住所一覧を渡されてごちゃごちゃ何かすることが多いのですが、書き方が統一されていないのでいつもキレ気味の私です。

この「住所のフォーマットを統一する」シリーズは数回続く予定です。

特に難しいことはしません。


yokobou2hyphen.js

// 横棒っぽいものを全てハイフンに置き換える

function yokobou(str){
//--‐―ーー─━ ← 横棒の例

// 横棒のリスト
var list = ["\uFF0D","\uFE63","\u2212","\u2010",
"\u2043","\u2011","\u2012","\u2013","\u2014",
"\ufe58","\u2015","\u23AF","\u23E4","\ux2D7",
"\u2796","\u208B","\u30FC","\uFF70"];

for(var i=0;i<list.length;i++){
// 数字と数字に挟まれた横棒を探す
var reg = new RegExp("\\d" + list[i] + "\\d","g"); // reg = /\dー\d/g
var match = str.match(reg);
if(match){
for(var j=0;j<match.length;j++){
var oldStr = match[j]; // ex) 5ー2
var newStr = match[j].replace(list[i],"-"); // ex) 5-2
str = str.replace(oldStr,newStr); // 該当箇所を置き換える
}
}
}
return str;
}

// 実行例
var add = "宮城県仙台市横浜区1ー2―3—405";
var add2 = yokobou(add);
// add2 = "宮城県仙台市横浜区1-2-3-405";


list で挙げたすべての横棒について、「数字(横棒)数字」という並びを正規表現で探し、「数字(ハイフン)数字」に置き換えています。

正規表現のところで g オプションを付けているので、該当する箇所全てが配列で返ってきます。

横棒のリストはこちらのサイト

http://www13.plala.or.jp/bigdata/yokobou.html

を参考にしました。

他にも思いついたら list に適宜付け加えてください。

例えば、listに"の"を追加すると、「1の2」→「1-2」ができます。

しかしもっと頭の良い根本的な解決方法は、ハイフン以外の横棒は使用禁止という規則を周知することじゃないかなと思います(怒)

(つづく)

(追記)

@luna-mrst さんから後半のfor文は正規表現にて簡略化できるとご指摘いただきました。

ありがとうございます。来週からの業務が捗ります(大袈裟でなく)。

以下コメント引用です。


yokobou2hyphen.js

function yokobou(str) {

const list = ["\uFF0D","\uFE63","\u2212","\u2010",
"\u2043","\u2011","\u2012","\u2013","\u2014",
"\ufe58","\u2015","\u23AF","\u23E4","\u02D7",
"\u2796","\u208B","\u30FC","\uFF70"];

const reg = new RegExp(`(?<=\\d)[${list.join('')}](?=\\d)`, 'g');
return str.replace(reg, '-');
}


(追記ここまで)

(追記2)2019/3/22

すみませんでした。再訂正です。

どうもGASの環境では①後読みが使えないことがわかりました。また、②arr.join("")をしたときに一部の横棒が文字化けしてうまく正規表現に組み込まれないようでした。この2点を踏まえて結局、以下のように改良しました。


yokobou2hyphen_new.js

function yokobou(str){

//--‐―ーー─━ ← 横棒の例

// 横棒のリスト
var list = ["\uFF0D","\uFE63","\u2212","\u2010",
"\u2043","\u2011","\u2012","\u2013","\u2014",
"\ufe58","\u2015","\u23AF","\u23E4","\ux2D7",
"\u2796","\u208B","\u30FC","\uFF70"];

for(var i=0;i<list.length;i++){
// 数字と数字に挟まれた横棒を探す
var reg = new RegExp("\\d" + list[i] + "(?=\\d)","g");
var match = str.match(reg);
if(match){
for(var j=0;j<match.length;j++){
var oldStr = match[j]; // ex) 5ー
var newStr = match[j].replace(list[i],"-"); // ex) 5-
str = str.replace(oldStr,newStr); // 該当箇所を置き換える
}
}
}
return str;
}


(追記2ここまで)