প্রশ্নটি সহজ: আমার একটি স্ট্রিং রয়েছে
str
, আমি কীভাবে চেক করব যেstr
এটি একটি একক ইমোজি, এবং অন্য কিছু নয়? অতিরিক্তভাবে আমি অন্য লাইব্রেরি ব্যবহার না করা পছন্দ করব।ম্যাচ
"🍎"
,"⛹🏿♂️"
,"3️⃣"
কিন্তু না"🍓a"
,"𝕒"
,"🍌🍀"
সমাধান পেতে আমার সমস্যা হচ্ছে তবে আমি এখনও পর্যন্ত চেষ্টা করেছি এমন কিছু জিনিস এখানে:
সমাধান 1 এর চেষ্টা করা - দৈর্ঘ্য এবং ...
অপারেটরের চারপাশে খেলুন
আমি শিখেছি ইমোজিরা একাধিক বাইট দখল করে থাকে, কেউ কেউ 4 টি বাইট বা আরও বেশিও দখল করে থাকে ... এবং আমরা স্ট্রিংয়ের length
সম্পত্তি দ্বারা এটি পরিমাপ করতে পারি :
console.log("🍎".length); // 2
console.log("🛡️".length); // 3
console.log("⛹🏿♂️".length); // 6
তারপরে আমি জানতে পেরেছিলাম যে ...
অপারেটর এটিকে অ্যাকাউন্টে নেয় এবং সঠিকভাবে অ্যারেতে ইমোজিগুলি পৃথক করে - আমি তার পরে ফলাফলের অ্যারের length
সম্পত্তি দেখতে এবং সেগুলি পৃথক করে কিনা তা সনাক্ত করতে পারি।
str = "⛹🏿♂️";
if (str.length !== [...str].length) {
// is emoji?
} else {
// is not emoji
}
তবে এটি অন্যান্য বহু-বাইট চরিত্রগুলির জন্য যাচাই করে না 𝕡
যেমনগুলির দৈর্ঘ্য ২. এছাড়াও কিছু ইমোজিগুলি এখনও একটি অদ্ভুতভাবে আলাদা হয়ে গিয়েছিল।
সমাধান সমাধান 2 - রেজেক্স, নিয়মিত প্রকাশ
অবশ্যই রেজেক্সটি দেখার বিষয় হবে তবে আমি এখনও একটি কার্যকর সমাধান খুঁজে পাইনি।
এই\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]
স্ট্রিংয়ের কোনও ইমোজিস রয়েছে কিনা তা সনাক্ত করতে এই উত্তরের রেজেেক্স পুরোপুরি সূক্ষ্ম কাজ করে তবে আমার অবস্থার সাথে প্রয়োগ করে এটি অনেক সমস্যা উত্পন্ন করে। আমার পরীক্ষাটি এখানে:
পার্ট এ - স্ট্রিং রেজেক্সের শুরু / শেষ ছাড়াই ( ^
এবং $
)
- 2 এ। 1
str.match(regex)
এটি অত্যন্ত অসম্পূর্ণ, এটি কিছু ইমোজিগুলি এবং অন্য কিছুকে ব্যবহারযোগ্য নয়। এতে এমনকি ইমোজি অক্ষর রয়েছে কিনা বা এটিতে একাধিক ইমোজি রয়েছে কিনা তা খুঁজে বের করার কোনও উপায় আমি দেখছি না:
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)); // [ '🌡', '🌡', index: 0, input: '🌡️🌡️' ]
console.log("a⛅".match(regex)); // [ '⛅', '⛅', index: 1, input: 'a⛅' ]
- 2A.2
regex.test(str)
সত্য ফিরে আসে যখনই কোনও ইমোজি স্ট্রিংটিতে অন্তর্ভুক্ত থাকে, যা আমি খুঁজছি এমন আচরণ নয়:
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
পার্ট বি - স্ট্রিং রেজেক্সের শুরু / শেষের সাথে ( ^
এবং $
)
- 2 বি 1 কোনও কারণে নির্দিষ্ট ইমোজিগুলিতে
str.match(regex)
ফিরে আসেnull
। আমার কোন কারণ নেই তবে আমি ধরে নিচ্ছি যে এটির কিছু সম্পর্ক আছে কারণstr.match(regex)
খণ্ড A এ এই ইমোজিগুলি ভেঙে দেওয়া হবে:
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)); // [ '💡', '💡', index: 0, input: '💡' ]
console.log("🌡️".match(regex)); // null
console.log("⛅".match(regex)); // [ '⛅', '⛅', index: 1, input: 'a⛅' ]
console.log("🍌🍀".match(regex)); // null
- 2B.2
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
পার্ট সি - অন্যান্য নিয়মিত অভিব্যক্তি
- আমি দেখেছি এই এক কিন্তু এটা অনুরূপ অসঙ্গতি দেয়, যদিও একই নয়
/(?:[\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
এই সমস্ত ইমোজি / ইউনিকোড / রেজেক্স জগাখিচুড়ি সম্পর্কে কি কোনও উপায় আছে? লাইব্রেরি / এপিএস কি একমাত্র উপায়? তারা কীভাবে এটা করে?