使用 Lua/PCRE/OpenResty 在正则表达式中检测所有表情符号

我有一个 JavaScript 正则表达式,可以匹配表情符号。如何使用 ngx.re.match(),它是 nginx web 服务器的 OpenResty 库的一部分,来匹配同样的字符。

这是在 JS 中匹配表情符号的原始正则表达式:

(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])
点赞
用户589924
用户589924

在 PCRE 中,\x{####} 可以被用作等同于 JavaScript 的 \u####

其次,JavaScript 模式用于匹配使用 UTF-16 编码的代码点。但是,由于我们将在 PCRE 中匹配代码点本身,因此我们需要“解码”代理对。

进行这两个更改后,我们得到以下代码:

[\xA9\xAE\x{2000}-\x{3300}\x{1F000}-\x{1FBFF}]

(我不知道 Lua,所以这部分提供生成此字符串的字符串文字。)

请注意,您的模式匹配的内容超过了大多数人认为的表情符号。表情符号出现在“表情符号”块中。该块(当前)跨越的代码点为 U+1F600 到 U+1F64F。在 Perl 中,您可以使用 \p{Block=Emoticons} 或甚至只是 \p{Emoticons} 来匹配这些代码点,但这些在 PCRE 中似乎不受支持。因此,要仅匹配表情符号,您会使用以下代码:

[\x{1F600}-\x{1F64F}]
2019-04-08 18:11:04