丸数字を数字に変換して返す関数
文字コードを使ってスマートに書けないかな?と思って調べたけど、丸数字は番号が連続してなかったので、ベタに丸数字の配列を持ったほうがシンプルという結論に。
const roundNums = '①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿'.split('') const roundNumReg = new RegExp(roundNums.join('|'), 'g') /** * 丸数字を数字に変換して返す * @param tgtStr 変換元の文字列 * @param [replaceFunc] 変換後の数字に対して変換処理をかけて返す関数 * @returns */ export const roundNumToNum = ({ tgtStr, replaceFunc, }: { tgtStr: string replaceFunc?: (num: number) => string }) => { return tgtStr.replace(roundNumReg, (match: string) => { const replaced = roundNums.indexOf(match) return replaced > -1 ? (replaceFunc ? replaceFunc(replaced + 1) : String(replaced + 1)) : '' }) }
呼び出し側
roundNumToNum({ tgtStr: '①②あああ③④' })) // 12あああ34 roundNumToNum({ tgtStr: '①②あああ③④', replaceFunc: (num: number) => '<span>' + num + '</span>', }) // <span>1</span><span>2</span>あああ<span>3</span><span>4</span>
以下は、結局調べたけど使わなかった。
丸数字のunicodeを把握
'①'.charCodeAt(0).toString(16) // 2460
unicodeを使った正規表現
'①'.match(/\u{2460}/u) // ['①', index: 0, input: '①', groups: undefined]