diff --git a/src/lib/patchAddr.ts b/src/lib/patchAddr.ts index 7a5fa73689..a70c18acb4 100644 --- a/src/lib/patchAddr.ts +++ b/src/lib/patchAddr.ts @@ -3,21 +3,21 @@ const addrPatches = [ pref: '香川県', city: '仲多度郡まんのう町', town: '勝浦', - pattern: '^字?家6', + pattern: '^字?家[6六]', result: '家六', }, { pref: '愛知県', city: 'あま市', town: '西今宿', - pattern: '^字?梶村1', + pattern: '^字?梶村[1一]', result: '梶村一', }, { pref: '香川県', city: '丸亀市', town: '原田町', - pattern: '^字?東三分1', + pattern: '^字?東三分[1一]', result: '東三分一', }, ] diff --git a/src/normalize.ts b/src/normalize.ts index e040f5b885..5eea88c062 100755 --- a/src/normalize.ts +++ b/src/normalize.ts @@ -435,40 +435,40 @@ export const normalize: Normalizer = async ( }) }) .replace( - /(([0-9〇一二三四五六七八九十百千]+)(番地?)([0-9〇一二三四五六七八九十百千]+)号)\s*(.+)/, + /(([0-9]+|[〇一二三四五六七八九十百千]+)(番地?)([0-9]+|[〇一二三四五六七八九十百千]+)号)\s*(.+)/, '$1 $5', ) .replace( - /([0-9〇一二三四五六七八九十百千]+)\s*(番地?)\s*([0-9〇一二三四五六七八九十百千]+)\s*号?/, + /([0-9]+|[〇一二三四五六七八九十百千]+)\s*(番地?)\s*([0-9]+|[〇一二三四五六七八九十百千]+)\s*号?/, '$1-$3', ) - .replace(/([0-9〇一二三四五六七八九十百千]+)番地?/, '$1') - .replace(/([0-9〇一二三四五六七八九十百千]+)の/g, '$1-') + .replace(/([0-9]+|[〇一二三四五六七八九十百千]+)番地?/, '$1') + .replace(/([0-9]+|[〇一二三四五六七八九十百千]+)の/g, '$1-') .replace( - /([0-9〇一二三四五六七八九十百千]+)[--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━]/g, + /([0-9]+|[〇一二三四五六七八九十百千]+)[--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━]/g, (match) => { return kan2num(match).replace(/[--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━]/g, '-') }, ) .replace( - /[--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━]([0-9〇一二三四五六七八九十百千]+)/g, + /[--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━]([0-9]+|[〇一二三四五六七八九十百千]+)/g, (match) => { return kan2num(match).replace(/[--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━]/g, '-') }, ) - .replace(/([0-9〇一二三四五六七八九十百千]+)-/, (s) => { + .replace(/([0-9]+|[〇一二三四五六七八九十百千]+)-/, (s) => { // `1-` のようなケース return kan2num(s) }) - .replace(/-([0-9〇一二三四五六七八九十百千]+)/, (s) => { + .replace(/-([0-9]+|[〇一二三四五六七八九十百千]+)/, (s) => { // `-1` のようなケース return kan2num(s) }) - .replace(/-[^0-9]([0-9〇一二三四五六七八九十百千]+)/, (s) => { + .replace(/-[^0-9]([0-9]+|[〇一二三四五六七八九十百千]+)/, (s) => { // `-あ1` のようなケース return kan2num(zen2han(s)) }) - .replace(/([0-9〇一二三四五六七八九十百千]+)$/, (s) => { + .replace(/([0-9]+|[〇一二三四五六七八九十百千]+)$/, (s) => { // `串本町串本1234` のようなケース return kan2num(s) }) diff --git a/test/main.test.ts b/test/main.test.ts index 748265fe34..291ffe0737 100644 --- a/test/main.test.ts +++ b/test/main.test.ts @@ -871,6 +871,24 @@ for (const [runtime, normalize] of cases) { expect(res).toStrictEqual({"pref": "東京都", "city": "千代田区", "town": "永田町一丁目", "addr": "2-3-レジデンス億万101", "lat": 35.675895, "lng": 139.746306, "level": 3}) }) + test('東京都千代田区三番町2番地4三番町KSビル10階(番地と建物名が混ざり、「番」が消えることがないこと)', async () => { + const res = await normalize('東京都千代田区三番町2番地4三番町KSビル10階') + expect(res).toStrictEqual({"pref": "東京都", "city": "千代田区", "town": "三番町", "addr": "2-4三町KSビル10階", "lat": 35.690557, "lng": 139.743591, "level": 3}) + }) + + test('東京都千代田区神田美土代町9番地7千代田21ビル7階(「7千代田」が「7000代田」にならないこと)', async () => { + const res = await normalize('東京都千代田区神田美土代町9番地7千代田21ビル7階') + expect(res).toStrictEqual({ + pref: '東京都', + city: '千代田区', + town: '神田美土代町', + addr: '9-7千代田21ビル7階', + lat: 35.693283, + lng: 139.765581, + level: 3 + }) + }) + describe('途中にスペースを含むケース', () => { // https://github.com/geolonia/normalize-japanese-addresses/issues/180 test('京都府京都市 下京区上之町999', async () => {