【发布时间】:2020-02-08 09:00:30
【问题描述】:
【问题讨论】:
【问题讨论】:
\p{Emoji} 匹配具有 Unicode Emoji 属性的所有内容。数字确实具有该属性,因此\p{Emoji} 匹配它们是正确的。为什么呢?
Unicode 标准将任何代码点定义为具有 Emoji 属性,前提是它可以作为 Emoji 的一部分出现。数字可以作为表情符号的一部分出现(例如,我认为上面有数字的形状,因为它们算作表情符号,由一个形状,后跟一个连接,然后是数字组成),所以它们具有该属性。
如果您只想匹配本身就是表情符号的代码点,则可以改用Emoji_Presentation 属性。但是,这将无法匹配组合的表情符号。
如果你想匹配任何创建表情符号的序列,我想你会想匹配类似“Emoji_Presentation,后跟零个或多个'(Join_Control或Variation_Selector),然后是@987654327 @'"(这里你需要Emoji 而不是Emoji_Presentation,因为那是允许数字的地方)。
但是,为了在标识符中允许表情符号(与词法分析器规则匹配表情符号相反),您实际上不必担心数字是否是表情符号的一部分,仅此而已它不会作为标识符的第一个字符出现。因此,您可以简单地将起始字符的片段定义为仅包含Emoji_Presentation,然后将后续字符的片段定义为包含Emoji 以及Join_Control 和Variation_Selector。
所以这样的事情会起作用:
fragment IdStart
: [_\p{Alpha}\p{General_Category=Other_Letter}\p{Emoji_Presentation}]
;
fragment IdContinue
: IdStart
// The `\p{Number}` might be redundant, I'm not sure. I don't know
// whether there are any (non-ascii) numeric codepoints that don't
// also have the `Emoji` property.
| [\p{Number}\p{Emoji}\p{Join_Control}\p{Variation_Selector}]
;
Identifier: IdStart IdContinue*;
当然,这是假设您实际上想要允许除表情符号之外的字符。您问题中的定义仅包括表情符号(或者无论如何都包含),但由于它被称为Identifier,我假设您只是删除了其他允许的类别以简化它。
【讨论】:
看看the code 似乎定义了表情符号代码点:
UnicodeSet emojiRKUnicodeSet = new UnicodeSet("[\\p{GCB=Regional_Indicator}\\*#0-9\\u00a9\\u00ae\\u2122\\u3030\\u303d]");
它看起来包含数字(为什么,我不知道,请查看 sepp2k 的出色解释)。 如果您认为有问题,可以随时raise an issue。
您也可以只使用这样的字符类:
Identifier
: [\u00a9\u00ae\u2000-\u3300\ud83c\ud000-\udfff\ud83d\ud000-\udfff\ud83e\ud000-\udfff]+
;
【讨论】: