丸数字を正規表現で数字に置換

丸数字を数字に変換して返す関数

文字コードを使ってスマートに書けないかな?と思って調べたけど、丸数字は番号が連続してなかったので、ベタに丸数字の配列を持ったほうがシンプルという結論に。

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]