使用表情符号检测表情符号是否为国旗

时间:2018-11-18 10:46:09

标签: javascript node.js regex pcre

我一直在尝试制作一个正则表达式,可以检测表情符号是否为国家/地区标志。我希望正则表达式匹配所有国家(从阿森松岛到津巴布韦)的国旗。

我的方法是在正则表达式中一一放置所有国旗。我希望有人可以向我展示一种更好的方法。

3 个答案:

答案 0 :(得分:3)

一个国家的国旗表情符号对应于一对识别国家的本地符号(两个字母)(例如,法国的FR-see list)。 您可以做的是使用匹配这些字母任意组合的正则表达式。当然,这将包括不存在的国家/地区代码(例如ZZ),但这应排除任何其他表情符号。

所以这里是

var reg = /[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/;
reg.test(""); // false
reg.test(""); // true

答案 1 :(得分:1)

要保持正则表达式的精确性,您只能构建正则表达式范围。

var country_emoji_ranges = ['\\u{1F1E6}[\\u{1F1E9}-\\u{1F1EC}\\u{1F1EE}\\u{1F1F1}\\u{1F1F2}\\u{1F1F4}\\u{1F1F6}-\\u{1F1FA}\\u{1F1FC}\\u{1F1FD}\\u{1F1FF}]',
	'\\u{1F1E7}[\\u{1F1E6}\\u{1F1E7}\\u{1F1E9}-\\u{1F1EF}\\u{1F1F1}-\\u{1F1F4}\\u{1F1F6}-\\u{1F1F9}\\u{1F1FB}\\u{1F1FC}\\u{1F1FE}\\u{1F1FF}]',
	'\\u{1F1E8}[\\u{1F1E6}\\u{1F1E8}\\u{1F1E9}\\u{1F1EB}-\\u{1F1EE}\\u{1F1F0}-\\u{1F1F4}\\u{1F1F7}\\u{1F1FA}-\\u{1F1FF}]',
	'\\u{1F1E9}[\\u{1F1EA}\\u{1F1EF}\\u{1F1F0}\\u{1F1F2}\\u{1F1F4}\\u{1F1FF}]',
	'\\u{1F1EA}[\\u{1F1E8}\\u{1F1EA}\\u{1F1EC}\\u{1F1ED}\\u{1F1F7}-\\u{1F1F9}]',
	'\\u{1F1EB}[\\u{1F1EE}\\u{1F1EF}\\u{1F1F0}\\u{1F1F2}\\u{1F1F4}\\u{1F1F7}]',
	'\\u{1F1EC}[\\u{1F1E6}\\u{1F1E7}\\u{1F1E9}-\\u{1F1EE}\\u{1F1F1}-\\u{1F1F3}\\u{1F1F5}-\\u{1F1FA}\\u{1F1FC}\\u{1F1FE}]',
	'\\u{1F1ED}[\\u{1F1F0}\\u{1F1F2}\\u{1F1F3}\\u{1F1F7}\\u{1F1F9}\\u{1F1FA}]',
	'\\u{1F1EE}[\\u{1F1E9}-\\u{1F1F4}\\u{1F1F6}-\\u{1F1F9}]',
	'\\u{1F1EF}[\\u{1F1EA}\\u{1F1F2}\\u{1F1F4}\\u{1F1F5}]',
	'\\u{1F1F0}[\\u{1F1EA}\\u{1F1EC}-\\u{1F1EE}\\u{1F1F2}\\u{1F1F3}\\u{1F1F5}\\u{1F1F7}\\u{1F1FC}\\u{1F1FE}\\u{1F1FF}]',
	'\\u{1F1F1}[\\u{1F1E6}-\\u{1F1E8}\\u{1F1EE}\\u{1F1F0}\\u{1F1F8}-\\u{1F1FB}\\u{1F1FE}]',
	'\\u{1F1F2}[\\u{1F1E6}\\u{1F1E8}-\\u{1F1ED}\\u{1F1F0}-\\u{1F1FF}]',
	'\\u{1F1F3}[\\u{1F1E6}\\u{1F1E8}\\u{1F1EA}-\\u{1F1EC}\\u{1F1EE}\\u{1F1F1}\\u{1F1F4}\\u{1F1F5}\\u{1F1F7}\\u{1F1FA}\\u{1F1FF}]',
	'\\u{1F1F4}\\u{1F1F2}',
	'\\u{1F1F5}[\\u{1F1E6}\\u{1F1EA}-\\u{1F1ED}\\u{1F1F0}-\\u{1F1F3}\\u{1F1F7}-\\u{1F1F9}\\u{1F1FC}\\u{1F1FE}]',
	'\\u{1F1F6}\\u{1F1E6}',
	'\\u{1F1F7}[\\u{1F1EA}\\u{1F1F4}\\u{1F1F8}\\u{1F1FA}\\u{1F1FC}]',
	'\\u{1F1F8}[\\u{1F1E6}-\\u{1F1EA}\\u{1F1EC}-\\u{1F1F4}\\u{1F1F7}-\\u{1F1F9}\\u{1F1FB}\\u{1F1FD}-\\u{1F1FF}]',
	'\\u{1F1F9}[\\u{1F1E8}\\u{1F1E9}\\u{1F1EB}-\\u{1F1ED}\\u{1F1EF}-\\u{1F1F4}\\u{1F1F7}\\u{1F1F9}\\u{1F1FB}\\u{1F1FC}\\u{1F1FF}]',
	'\\u{1F1FA}[\\u{1F1E6}\\u{1F1EC}\\u{1F1F2}\\u{1F1F8}\\u{1F1FE}\\u{1F1FF}]',
	'\\u{1F1FB}[\\u{1F1E6}\\u{1F1E8}\\u{1F1EA}\\u{1F1EC}\\u{1F1EE}\\u{1F1F3}\\u{1F1FA}]',
	'\\u{1F1FC}[\\u{1F1EB}\\u{1F1F8}]',
	'\\u{1F1FE}[\\u{1F1EA}\\u{1F1F9}]',
	'\\u{1F1FF}[\\u{1F1E6}\\u{1F1F2}\\u{1F1FC}]'
];
var country_emoji_rx = new RegExp(country_emoji_ranges.join('|'), 'ug');
var text = "\u{1F1E6}\u{1F1E9}, \u{1F1E6}\u{1F1EA}, \u{1F1E6}\u{1F1EB}, \u{1F1E6}\u{1F1EC}, \u{1F1E6}\u{1F1EE}, \u{1F1E6}\u{1F1F1}, \u{1F1E6}\u{1F1F2}, \u{1F1E6}\u{1F1F4}, \u{1F1E6}\u{1F1F6}, \u{1F1E6}\u{1F1F7}, \u{1F1E6}\u{1F1F8}, \u{1F1E6}\u{1F1F9}, \u{1F1E6}\u{1F1FA}, \u{1F1E6}\u{1F1FC}, \u{1F1E6}\u{1F1FD}, \u{1F1E6}\u{1F1FF}, \u{1F1E7}\u{1F1E6}, \u{1F1E7}\u{1F1E7}, \u{1F1E7}\u{1F1E9}, \u{1F1E7}\u{1F1EA}, \u{1F1E7}\u{1F1EB}, \u{1F1E7}\u{1F1EC}, \u{1F1E7}\u{1F1ED}, \u{1F1E7}\u{1F1EE}, \u{1F1E7}\u{1F1EF}, \u{1F1E7}\u{1F1F1}, \u{1F1E7}\u{1F1F2}, \u{1F1E7}\u{1F1F3}, \u{1F1E7}\u{1F1F4}, \u{1F1E7}\u{1F1F6}, \u{1F1E7}\u{1F1F7}, \u{1F1E7}\u{1F1F8}, \u{1F1E7}\u{1F1F9}, \u{1F1E7}\u{1F1FB}, \u{1F1E7}\u{1F1FC}, \u{1F1E7}\u{1F1FE}, \u{1F1E7}\u{1F1FF}, \u{1F1E8}\u{1F1E6}, \u{1F1E8}\u{1F1E8}, \u{1F1E8}\u{1F1E9}, \u{1F1E8}\u{1F1EB}, \u{1F1E8}\u{1F1EC}, \u{1F1E8}\u{1F1ED}, \u{1F1E8}\u{1F1EE}, \u{1F1E8}\u{1F1F0}, \u{1F1E8}\u{1F1F1}, \u{1F1E8}\u{1F1F2}, \u{1F1E8}\u{1F1F3}, \u{1F1E8}\u{1F1F4}, \u{1F1E8}\u{1F1F7}, \u{1F1E8}\u{1F1FA}, \u{1F1E8}\u{1F1FB}, \u{1F1E8}\u{1F1FC}, \u{1F1E8}\u{1F1FD}, \u{1F1E8}\u{1F1FE}, \u{1F1E8}\u{1F1FF}, \u{1F1E9}\u{1F1EA}, \u{1F1E9}\u{1F1EF}, \u{1F1E9}\u{1F1F0}, \u{1F1E9}\u{1F1F2}, \u{1F1E9}\u{1F1F4}, \u{1F1E9}\u{1F1FF}, \u{1F1EA}\u{1F1E8}, \u{1F1EA}\u{1F1EA}, \u{1F1EA}\u{1F1EC}, \u{1F1EA}\u{1F1ED}, \u{1F1EA}\u{1F1F7}, \u{1F1EA}\u{1F1F8}, \u{1F1EA}\u{1F1F9}, \u{1F1EB}\u{1F1EE}, \u{1F1EB}\u{1F1EF}, \u{1F1EB}\u{1F1F0}, \u{1F1EB}\u{1F1F2}, \u{1F1EB}\u{1F1F4}, \u{1F1EB}\u{1F1F7}, \u{1F1EC}\u{1F1E6}, \u{1F1EC}\u{1F1E7}, \u{1F1EC}\u{1F1E9}, \u{1F1EC}\u{1F1EA}, \u{1F1EC}\u{1F1EB}, \u{1F1EC}\u{1F1EC}, \u{1F1EC}\u{1F1ED}, \u{1F1EC}\u{1F1EE}, \u{1F1EC}\u{1F1F1}, \u{1F1EC}\u{1F1F2}, \u{1F1EC}\u{1F1F3}, \u{1F1EC}\u{1F1F5}, \u{1F1EC}\u{1F1F6}, \u{1F1EC}\u{1F1F7}, \u{1F1EC}\u{1F1F8}, \u{1F1EC}\u{1F1F9}, \u{1F1EC}\u{1F1FA}, \u{1F1EC}\u{1F1FC}, \u{1F1EC}\u{1F1FE}, \u{1F1ED}\u{1F1F0}, \u{1F1ED}\u{1F1F2}, \u{1F1ED}\u{1F1F3}, \u{1F1ED}\u{1F1F7}, \u{1F1ED}\u{1F1F9}, \u{1F1ED}\u{1F1FA}, \u{1F1EE}\u{1F1E9}, \u{1F1EE}\u{1F1EA}, \u{1F1EE}\u{1F1F1}, \u{1F1EE}\u{1F1F2}, \u{1F1EE}\u{1F1F3}, \u{1F1EE}\u{1F1F4}, \u{1F1EE}\u{1F1F6}, \u{1F1EE}\u{1F1F7}, \u{1F1EE}\u{1F1F8}, \u{1F1EE}\u{1F1F9}, \u{1F1EF}\u{1F1EA}, \u{1F1EF}\u{1F1F2}, \u{1F1EF}\u{1F1F4}, \u{1F1EF}\u{1F1F5}, \u{1F1F0}\u{1F1EA}, \u{1F1F0}\u{1F1EC}, \u{1F1F0}\u{1F1ED}, \u{1F1F0}\u{1F1EE}, \u{1F1F0}\u{1F1F2}, \u{1F1F0}\u{1F1F3}, \u{1F1F0}\u{1F1F5}, \u{1F1F0}\u{1F1F7}, \u{1F1F0}\u{1F1FC}, \u{1F1F0}\u{1F1FE}, \u{1F1F0}\u{1F1FF}, \u{1F1F1}\u{1F1E6}, \u{1F1F1}\u{1F1E7}, \u{1F1F1}\u{1F1E8}, \u{1F1F1}\u{1F1EE}, \u{1F1F1}\u{1F1F0}, \u{1F1F1}\u{1F1F7}, \u{1F1F1}\u{1F1F8}, \u{1F1F1}\u{1F1F9}, \u{1F1F1}\u{1F1FA}, \u{1F1F1}\u{1F1FB}, \u{1F1F1}\u{1F1FE}, \u{1F1F2}\u{1F1E6}, \u{1F1F2}\u{1F1E8}, \u{1F1F2}\u{1F1E9}, \u{1F1F2}\u{1F1EA}, \u{1F1F2}\u{1F1EB}, \u{1F1F2}\u{1F1EC}, \u{1F1F2}\u{1F1ED}, \u{1F1F2}\u{1F1F0}, \u{1F1F2}\u{1F1F1}, \u{1F1F2}\u{1F1F2}, \u{1F1F2}\u{1F1F3}, \u{1F1F2}\u{1F1F4}, \u{1F1F2}\u{1F1F5}, \u{1F1F2}\u{1F1F6}, \u{1F1F2}\u{1F1F7}, \u{1F1F2}\u{1F1F8}, \u{1F1F2}\u{1F1F9}, \u{1F1F2}\u{1F1FA}, \u{1F1F2}\u{1F1FB}, \u{1F1F2}\u{1F1FC}, \u{1F1F2}\u{1F1FD}, \u{1F1F2}\u{1F1FE}, \u{1F1F2}\u{1F1FF}, \u{1F1F3}\u{1F1E6}, \u{1F1F3}\u{1F1E8}, \u{1F1F3}\u{1F1EA}, \u{1F1F3}\u{1F1EB}, \u{1F1F3}\u{1F1EC}, \u{1F1F3}\u{1F1EE}, \u{1F1F3}\u{1F1F1}, \u{1F1F3}\u{1F1F4}, \u{1F1F3}\u{1F1F5}, \u{1F1F3}\u{1F1F7}, \u{1F1F3}\u{1F1FA}, \u{1F1F3}\u{1F1FF}, \u{1F1F4}\u{1F1F2}, \u{1F1F5}\u{1F1E6}, \u{1F1F5}\u{1F1EA}, \u{1F1F5}\u{1F1EB}, \u{1F1F5}\u{1F1EC}, \u{1F1F5}\u{1F1ED}, \u{1F1F5}\u{1F1F0}, \u{1F1F5}\u{1F1F1}, \u{1F1F5}\u{1F1F2}, \u{1F1F5}\u{1F1F3}, \u{1F1F5}\u{1F1F7}, \u{1F1F5}\u{1F1F8}, \u{1F1F5}\u{1F1F9}, \u{1F1F5}\u{1F1FC}, \u{1F1F5}\u{1F1FE}, \u{1F1F6}\u{1F1E6}, \u{1F1F7}\u{1F1EA}, \u{1F1F7}\u{1F1F4}, \u{1F1F7}\u{1F1F8}, \u{1F1F7}\u{1F1FA}, \u{1F1F7}\u{1F1FC}, \u{1F1F8}\u{1F1E6}, \u{1F1F8}\u{1F1E7}, \u{1F1F8}\u{1F1E8}, \u{1F1F8}\u{1F1E9}, \u{1F1F8}\u{1F1EA}, \u{1F1F8}\u{1F1EC}, \u{1F1F8}\u{1F1ED}, \u{1F1F8}\u{1F1EE}, \u{1F1F8}\u{1F1EF}, \u{1F1F8}\u{1F1F0}, \u{1F1F8}\u{1F1F1}, \u{1F1F8}\u{1F1F2}, \u{1F1F8}\u{1F1F3}, \u{1F1F8}\u{1F1F4}, \u{1F1F8}\u{1F1F7}, \u{1F1F8}\u{1F1F8}, \u{1F1F8}\u{1F1F9}, \u{1F1F8}\u{1F1FB}, \u{1F1F8}\u{1F1FD}, \u{1F1F8}\u{1F1FE}, \u{1F1F8}\u{1F1FF}, \u{1F1F9}\u{1F1E8}, \u{1F1F9}\u{1F1E9}, \u{1F1F9}\u{1F1EB}, \u{1F1F9}\u{1F1EC}, \u{1F1F9}\u{1F1ED}, \u{1F1F9}\u{1F1EF}, \u{1F1F9}\u{1F1F0}, \u{1F1F9}\u{1F1F1}, \u{1F1F9}\u{1F1F2}, \u{1F1F9}\u{1F1F3}, \u{1F1F9}\u{1F1F4}, \u{1F1F9}\u{1F1F7}, \u{1F1F9}\u{1F1F9}, \u{1F1F9}\u{1F1FB}, \u{1F1F9}\u{1F1FC}, \u{1F1F9}\u{1F1FF}, \u{1F1FA}\u{1F1E6}, \u{1F1FA}\u{1F1EC}, \u{1F1FA}\u{1F1F2}, \u{1F1FA}\u{1F1F8}, \u{1F1FA}\u{1F1FE}, \u{1F1FA}\u{1F1FF}, \u{1F1FB}\u{1F1E6}, \u{1F1FB}\u{1F1E8}, \u{1F1FB}\u{1F1EA}, \u{1F1FB}\u{1F1EC}, \u{1F1FB}\u{1F1EE}, \u{1F1FB}\u{1F1F3}, \u{1F1FB}\u{1F1FA}, \u{1F1FC}\u{1F1EB}, \u{1F1FC}\u{1F1F8}, \u{1F1FE}\u{1F1EA}, \u{1F1FE}\u{1F1F9}, \u{1F1FF}\u{1F1E6}, \u{1F1FF}\u{1F1F2}, \u{1F1FF}\u{1F1FC}";
console.log(text.match(country_emoji_rx).length);

如果要与不支持u标志的JS环境中的内容匹配,可以使用https://stackoverflow.com/a/51479846/5698871版本:

/(?:\uD83C\uDDE6)(?:\uD83C[\uDDE9-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|(?:\uD83C\uDDE7)(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|(?:\uD83C\uDDE8)(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF4\uDDF7\uDDFA-\uDDFF])|(?:\uD83C\uDDE9)(?:\uD83C[\uDDEA\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|(?:\uD83C\uDDEA)(?:\uD83C[\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDF9])|(?:\uD83C\uDDEB)(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|(?:\uD83C\uDDEC)(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|(?:\uD83C\uDDED)(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|(?:\uD83C\uDDEE)(?:\uD83C[\uDDE9-\uDDF4\uDDF6-\uDDF9])|(?:\uD83C\uDDEF)(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C\uDDF0)(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|(?:\uD83C\uDDF1)(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF8-\uDDFB\uDDFE])|(?:\uD83C\uDDF2)(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|(?:\uD83C\uDDF3)(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|(?:\uD83C\uDDF4)(?:\uD83C\uDDF2)|(?:\uD83C\uDDF5)(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|(?:\uD83C\uDDF6)(?:\uD83C\uDDE6)|(?:\uD83C\uDDF7)(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|(?:\uD83C\uDDF8)(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|(?:\uD83C\uDDF9)(?:\uD83C[\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|(?:\uD83C\uDDFA)(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF])|(?:\uD83C\uDDFB)(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|(?:\uD83C\uDDFC)(?:\uD83C[\uDDEB\uDDF8])|(?:\uD83C\uDDFE)(?:\uD83C[\uDDEA\uDDF9])|(?:\uD83C\uDDFF)(?:\uD83C[\uDDE6\uDDF2\uDDFC])/g

答案 2 :(得分:0)

由于标志实际上是由两个Unicode字符创建的,因此假设str.match(/[-]{2}/u)包含字符串,则可能的选择是str。范围表达式中的两个值分别是U + 1F1E6(区域指示符号字母A)和U + 1F1FF(区域指示符号字母Z),从Unicode 6.0开始都可以使用。

该解决方案的主要缺点是,它匹配那些指示符符号的所有可能组合,因此不能保证指示符表示有效的内容,例如。也会匹配。

相关问题