- Starts with bytes [\x23\x30-\x39], which in ASCII is [#0-9],
- Optionally followed by \xEF\xB8\x8F (U+FE0F)
- Ends with \xE2\x83\xA3
[#0-9](?>\xEF\xB8\x8F)?\xE2\x83\xA3
- Either \xC2\xA9 or \xC2\xAE
\xC2[\xA9\xAE]
- Starts with \xE2
- Followed by two bytes (as per UTF-8)
- Most of the emoji optionally end with \xEF\xB8\x8F
\xE2..(?>\xEF\xB8\x8F)?
- Starts with \xE3
- Followed either by \x80 or \x8A, then another byte
- Optionally ends with \xEF\xB8\x8F
\xE3[\x80\x8A].(?>\xEF\xB8\x8F)?
- Starts with \xF0\x9F
- Followed by any one of \x80, \x83, \x85 or \x86
- Followed by any byte (technically only a few bytes are legal as per UTF-8 but this point is irrelevant to our purpose)
- A couple of emoji end with \xEF\xB8\x8F
\xF0\x9F[\x80\x83\x85\x86].(?>\xEF\xB8\x8F)?
- Two series of
\xF0\x9F\x87.
sequences
\xF0\x9F\x87.\xF0\x9F\x87.
- Starts with \xF0\x9F
- Followed by [\x88-\x9B] and another byte
- Two emoji optionally end with \xEF\xB8\x8F
\xF0\x9F[\x88-\x9B].(?>\xEF\xB8\x8F)?
\xF0\x9F[\x80\x83\x85\x86].(?>\xEF\xB8\x8F)?
\xF0\x9F\x87.\xF0\x9F\x87.
\xF0\x9F[\x88-\x9B].(?>\xEF\xB8\x8F)?
Together: \xF0\x9F(?>[\x80\x83\x85\x86].(?>\xEF\xB8\x8F)?|\x87.\xF0\x9F\x87.|[\x88-\x9B].(?>\xEF\xB8\x8F)?)
[#0-9](?>\xEF\xB8\x8F)?\xE2\x83\xA3
\xC2[\xA9\xAE]
\xE2..(?>\xEF\xB8\x8F)?
\xE3[\x80\x8A].(?>\xEF\xB8\x8F)?
\xF0\x9F(?>[\x80\x83\x85\x86].(?>\xEF\xB8\x8F)?|\x87.\xF0\x9F\x87.|[\x88-\x9B].(?>\xEF\xB8\x8F)?)
Together: [#0-9](?>\xEF\xB8\x8F)?\xE2\x83\xA3|\xC2[\xA9\xAE]|\xE2..(?>\xEF\xB8\x8F)?|\xE3[\x80\x8A].(?>\xEF\xB8\x8F)?|\xF0\x9F(?>[\x80\x83\x85\x86].(?>\xEF\xB8\x8F)?|\x87.\xF0\x9F\x87.|[\x88-\x9B].(?>\xEF\xB8\x8F)?)