प्रश्न सरल है: मेरे पास एक स्ट्रिंग है
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 है। प्लस कुछ इमोजीज़ अभी भी एक अजीब में अलग हो रहे थे।
समाधान 2 का प्रयास - Regex, नियमित अभिव्यक्ति
बेशक regex देखने की बात होगी, लेकिन मैं अभी तक एक व्यवहार्य समाधान खोजने के लिए है।
यह जवाब रेगेक्स यह\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]
पता लगाने के लिए पूरी तरह से ठीक काम करता है कि क्या किसी स्ट्रिंग में कोई एमोजिस है, लेकिन मेरी स्थिति पर लागू होने से यह बहुत सारी समस्याएं पैदा करता है। यहाँ मेरे परीक्षण हैं:
भाग A - स्ट्रिंग रेगेक्स की शुरुआत / अंत के बिना ( ^
और $
)
- 2A.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⛅' ]
-
regex.test(str)
जब भी एक इमोजी को स्ट्रिंग में शामिल किया जाता है, 2A.2 सच होता है, जो वह व्यवहार नहीं है जिसकी मुझे तलाश है:
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 किसी कारण के लिए कुछ emojis पर
str.match(regex)
लौटता हैnull
। मेरे पास कोई सुराग नहीं है, लेकिन मैं यह मान रहा हूं कि इसका कुछ संबंध यह है किstr.match(regex)
भाग ए में इन इमोजीस को क्यों तोड़ा जाएगा:
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
क्या इस इमोजी / यूनिकोड / रेगेक्स मेस के आसपास कोई रास्ता है? क्या पुस्तकालय / एपिस ही एकमात्र तरीका है? वह यह कैसे करते हैं?