unicodeサロゲートペアにマッチする正規表現を作る
Emoticonでの例
/[\\u{1F600}-\\u{1F64F}]/uを
/\\uD83D[\\uDE00-\\uDE4F]/にした
このページの下にあるconvert-sarogate-pair.jsを使う
https://gyazo.com/c887b97a5594538bfbfbe92382f1984f
ペアの1文字目が同じなので簡単。
2文字目だけrange指定すると、こうなる
/\\uD83D[\\uDE00-\\uDE4F]/
簡単!
Miscellaneous Symbols and Pictographsでの例
こっちはちょっと面倒くさい
/[\\u{1F300}-\\u{1F5FF}]/uを
/(?:\\uD83C[\\uDF00-\\uDFFF])|(?:\\uD83D[\\uDC00-\\uDDFF])/にする
https://gyazo.com/420f1e07345df0a7e959b7a7f561bfdb
ペアの1文字目が\uD83Cと\uD83Dで、違う
ペアの2文字目は、サロゲートペアでは\uDC00から\uDFFFまでと範囲が決まっている
2つに分けないと正規表現にできない
/\\uD83C[\\uDF00-\\uDFFF]/と
/\\uD83D[\\uDC00-\\uDDFF]/になる
2つを合体させる
/(?:\\uD83C[\\uDF00-\\uDFFF])|(?:\\uD83D[\\uDC00-\\uDDFF])/になる
code:convert-sarogate-pair.js
const inputs = process.argv.slice(2)
function check (input) {
console.error(${input} is not a sarogate pair)
console.error('e.g. 0x1F300')
process.exit(1)
}
}
for (const codeHex of inputs) {
check(codeHex)
showSarogatePair(codeHex)
}
function showSarogatePair (codeHex) {
const high, low = toCodePoint(parseInt(codeHex)) const sarogatePairUnicode = high, low.map(i => '\\u' + i.toString(16).toUpperCase()).join('') console.log(${codeHex} => ${sarogatePairUnicode})
}
function toCodePoint (codeNum) {
const cp = codeNum - 0x10000
const high = 0xD800 | (cp >>> 10)
const low = 0xDC00 | (cp & 0x3FF)
}