unicodeサロゲートペアにマッチする正規表現を作る
Emoticonでの例
/[\\u{1F600}-\\u{1F64F}]/u
を
/\\uD83D[\\uDE00-\\uDE4F]/
にした
このページの下にある convert-sarogate-pair.js
を使う
ペアの1文字目が同じなので簡単。
2文字目だけrange指定すると、こうなる
/\\uD83D[\\uDE00-\\uDE4F]/
簡単!
Miscellaneous Symbols and Pictographsでの例
こっちはちょっと面倒くさい
/[\\u{1F300}-\\u{1F5FF}]/u
を
/(?:\\uD83C[\\uDF00-\\uDFFF])|(?:\\uD83D[\\uDC00-\\uDDFF])/
にする
ペアの1文字目が \uD83C
と \uD83D
で、違う
ペアの2文字目は、サロゲートペアでは \uDC00
から \uDFFF
までと範囲が決まっている
2つに分けないと正規表現にできない
/\\uD83C[\\uDF00-\\uDFFF]/
と
/\\uD83D[\\uDC00-\\uDDFF]/
になる
2つを合体させる
/(?:\\uD83C[\\uDF00-\\uDFFF])|(?:\\uD83D[\\uDC00-\\uDDFF])/
になる
convert-sarogate-pair.jsconst inputs = process.argv.slice(2)
function check (input) {
if (!/^0x[a-zA-Z\d]{5,6}$/.test(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)
return [high, low]
}