问题很简单:我有一个字符串
{ Error: read ECONNRESET at TLSWrap.onStreamRead (internal/stream_base_commons.js:111:27) name: 'MongoNetworkError',errorLabels: [ 'TransientTransactionError' ],[Symbol(mongoErrorContextSymbol)]: {} } (node:21748) UnhandledPromiseRejectionWarning: Error: read ECONNRESET at TLSWrap.onStreamRead (internal/stream_base_commons.js:111:27) (node:21748) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block,or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:21748) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future,promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
,如何检查str
是一个表情符号,没有别的?另外,我宁愿不使用其他库。匹配
str
,"?"
,"⛹?♂️"
,但不匹配"3️⃣"
,"?a"
,"?"
我在寻找解决方案时遇到了麻烦,但是到目前为止,我尝试了以下一些操作:
尝试的解决方案1-玩弄长度和"??"
运算符
我了解到,表情符号占据一个以上的字节,有些甚至占据4个字节,甚至更多……我们可以通过字符串的...
属性进行测量:
length
然后,我发现console.log("?".length); // 2
console.log("?️".length); // 3
console.log("⛹?♂️".length); // 6
运算符考虑了这一点并正确地分隔了数组中的表情符号-然后,我可以看到结果数组的...
属性,并检测它们是否不同。
length
但是,这不会检查长度为2的其他多字节字符,例如str = "⛹?♂️";
if (str.length !== [...str].length) {
// is emoji?
} else {
// is not emoji
}
。另外,有些表情符号仍然很奇怪。
尝试解决方案2-正则表达式,正则表达式
当然要研究正则表达式,但是我还没有找到可行的解决方案。
This answer的正则表达式?
可以很好地检测字符串是否包含表情符号,但将其应用于我的情况会产生很多问题。这是我的测试:
A部分-没有字符串正则表达式(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]
和^
)的开头/结尾
- 2A.1
$
非常不一致,它分解了一些表情符号和其他一些无法使用的表情符号。我找不到一种方法来找出它是否甚至包含非表情符号字符或是否包含多个表情符号:
str.match(regex)
-
每当字符串中包含表情符号时,
- 2A.2
let regex = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/; console.log("5️⃣".match(regex)); // [ '⃣','⃣',index: 2,input: '5️⃣' ] console.log("?".match(regex)); // [ '?','?',index: 0,input: '?' ] console.log("?️?️".match(regex)); // [ '?',input: '?️?️' ] console.log("a⛅".match(regex)); // [ '⛅','⛅',index: 1,input: 'a⛅' ]
就会返回true,这不是我要查找的行为:
regex.test(str)
B部分-以字符串正则表达式(let regex = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/;
console.log(regex.test("5️⃣")); // true - correct
console.log(regex.test("a")); // false - correct
console.log(regex.test("?️?️")); // true - should be false
console.log(regex.test("hello ⛅!")); // true - should be false
和^
)的开头/结尾
- 2B.1 由于某些原因,
$
返回某些表情符号上的str.match(regex)
。我不知道为什么,但是我假设它与null
为什么会分解A部分中的这些表情符号有一定关系:
str.match(regex)
- 2B.2
let regex = /^(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])$/; console.log("5️⃣".match(regex)); // null console.log("?".match(regex)); // [ '?',input: '?' ] console.log("?️".match(regex)); // null console.log("⛅".match(regex)); // [ '⛅',input: 'a⛅' ] console.log("??".match(regex)); // null
将在与regex.test(str)
在false
返回null
的表情符号上返回str.match(regex)
:
let regex = /^(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])$/;
console.log(regex.test("5️⃣")); // false - should be true
console.log(regex.test("?")); // true - correct
console.log(regex.test("?️")); // false - should be true
console.log(regex.test("⛅")); // true - correct
console.log(regex.test("??")); // false - correct
C部分-其他正则表达式
- 我发现了this one,但它给出了相似的不一致之处,尽管
/(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c[\ude01\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|[\ud83c[\ude50\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g
并不相同:
let regex = /^(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c[\ude01\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|[\ud83c[\ude50\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])$/g
console.log(regex.test("5️⃣")); // true - correct
console.log(regex.test("?")); // false - should be true
console.log(regex.test("?️")); // false - should be true
console.log(regex.test("⛅")); // true - correct
console.log(regex.test("??")); // false - correct
- 这也令人震惊(第二项测试基于第一项测试而改变了吗?)
let regex = /^(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c[\ude01\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|[\ud83c[\ude50\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])$/g
console.log(regex.test("⛹?♂️")); // false
console.log(regex.test("⛅")); // true
let regex = /^(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c[\ude01\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|[\ud83c[\ude50\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])$/g;
console.log(regex.test("⛹")); // true
console.log(regex.test("⛅")); // false
有没有办法解决所有表情符号/ unicode / regex混乱?库/ api是唯一的方法吗?他们是如何做到的?