generated at
unicodeサロゲートペアにマッチする正規表現を作る

https://github.com/nota/scrapbox/pull/2584 で、 0x10000 以上のunicodeにマッチする正規表現をuフラグを使わず、サロゲートペアで書くのをやったshokai

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])/ になる
(?: ) non-capturing parenthesesという、matchに含まれないグループ記法です


convert-sarogate-pair.js
const 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] }