我有一个用UTF-8编码的字符串.例如:
Thats a nice joke
Run Code Online (Sandbox Code Playgroud)
我必须提取句子中的所有表情符号.表情符号可以是任何表情符号
当在终端使用命令查看此句子时,less text.txt
它被视为:
Thats a nice joke <U+1F606><U+1F606><U+1F606> <U+1F61B>
Run Code Online (Sandbox Code Playgroud)
这是表情符号的相应UTF代码.emojis的所有代码都可以在emojitracker找到.
为了找到所有的出现,我使用了正则表达式模式,(<U\+\w+?>)
但它不适用于UTF-8编码的字符串.
以下是我的代码:
String s="Thats a nice joke ";
Pattern pattern = Pattern.compile("(<U\\+\\w+?>)");
Matcher matcher = pattern.matcher(s);
List<String> matchList = new ArrayList<String>();
while (matcher.find()) {
matchList.add(matcher.group());
}
for(int i=0;i<matchList.size();i++){
System.out.println(matchList.get(i));
}
Run Code Online (Sandbox Code Playgroud)
这个pdf说Range: 1F300–1F5FF for Miscellaneous Symbols and Pictographs
.所以我想捕捉这个范围内的任何角色.
我需要有关如何检测输入是否包含日语表情符号/表情符号的帮助.目前我正在构建一个charset = utf-8的系统.在输入文本上,用户可以输入日文字符/ alpanumerics /符号,但如果他们插入表情符号,onsubmit javascript将检查是否有表情符号,将显示错误信息.真的不知道如何检测表情符号.
问题很简单:我有一个字符串
str
,如何检查str
一个表情符号,是否只有一个?另外,我宁愿不使用其他库。比赛
""
,"????"
,"3??"
但不"a"
,""
,""
我在寻找解决方案时遇到了麻烦,但是到目前为止,我已经尝试了一些方法:
...
运算符我了解到,表情符号占据一个以上的字节,有些甚至占据4个字节,甚至更多……我们可以通过字符串的length
属性来衡量:
console.log("".length); // 2
console.log("?".length); // 3
console.log("????".length); // 6
Run Code Online (Sandbox Code Playgroud)
然后我发现...
运算符考虑了这一点,并正确分离了数组中的表情符号-然后,我可以查看结果数组的length
属性并检测它们是否不同。
str = "????";
if (str.length !== [...str].length) {
// is emoji?
} else {
// is not emoji
}
Run Code Online (Sandbox Code Playgroud)
但是,这不会检查其他多字节字符,例如长度为2的字符。另外,有些表情符号仍然变得奇怪。
当然,正则表达式是一个值得研究的问题,但是我还没有找到可行的解决方案。
这个答案的正则表达式\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]
可以很好地检测字符串是否有表情符号,但是将其应用于我的情况会产生很多问题。这是我的测试:
A部分-没有字符串正则表达式(^
和$
)的开始/结束
str.match(regex)
非常不一致,它分解了一些表情符号和其他一些无法使用的表情符号。我没有找到一种方法来找出它是否甚至包含非表情符号字符或是否包含多个表情符号:let regex = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/;
console.log("5??".match(regex)); // [ …
Run Code Online (Sandbox Code Playgroud)