2015-01-21 5 views
5

हम एक परियोजना जहाँ हम उन दोनों इमोजी सिंटैक्स का उपयोग करने में सक्षम होना चाहते पर काम कर रहे हैं (जैसे :smile:, :heart:, :confused:, :stuck_out_tongue:) के साथ ही सामान्य इमोटिकॉन्स (जैसे :), <3, :/, :p)रेगुलर एक्सप्रेशन मिलान का इमोटिकॉन

मैं इमोटिकॉन वाक्य रचना में परेशानी आ रही है क्योंकि कभी कभी उन चरित्र दृश्यों में हो जाएगा:

  • सामान्य तार या यूआरएल - http ://उदाहरण। कॉम
  • इमोजी वाक्य रचना के भीतर - :p encil:

मैं इन इमोटिकॉन चरित्र दृश्यों नहीं बल्कि कैसे मिल सकता है जब अन्य पात्रों उनके पास कर रहे हैं? http://regexr.com/3a8o5

+0

इसे कई रेगेक्स में क्यों विभाजित नहीं किया गया है? साथ ही, आप क्या कर सकते हैं सीमाओं के साथ मेल खाता है, उदाहरण के लिए '/ \ b: \) \ b /' – elclanrs

+0

यदि मुझे सही याद है, तो [Twemoji] (https://github.com/twitter/twemoji/) और [ Emojione] (https://github.com/Ranks/emojione/tree/master/lib/js) जेएस कोड को उनके छवि सेट के साथ करने के लिए प्रदान करते हैं और गीथूब, एनपीएम, बॉवर इत्यादि पर एक ही चीज़ के दर्जनों कार्यान्वयन होते हैं। – Crissov

उत्तर

5

मैच इमोजी पहले (की देखभाल करने के उदाहरण) और फिर एक को समाप्त खाली स्थान या नई पंक्ति के लिए जाँच:

(\:\w+\:|\<[\/\\]?3|[\(\)\\\D|\*\$][\-\^]?[\:\;\=]|[\:\;\=B8][\-\^]?[3DOPp\@\$\*\\\)\(\/\|])(?=\s|[\!\.\?]|$) 

इस regex निम्नलिखित (पसंद करते हैं इमोजी मेल खाता है) समूह 1 मिलान में मैच लौटने:

:(:) :P :p :O :3 :| :/ :\ :$ :* :@ 
:-(:-) :-P :-p :-O :-3 :-| :-/ :-\ :-$ :-* :[email protected] 
:^(:^) :^P :^p :^O :^3 :^| :^/ :^\ :^$ :^* :^@ 
): (: $: *: 
)-: (-: $-: *-: 
)^: (^: $^: *^: 
<3 </3 <\3 
:smile: :hug: :pencil: 

यह भी सफेद स्थान के अलावा परिसीमक के रूप में टर्मिनल विराम चिह्न का समर्थन करता है।

आप अधिक विवरण देख सकते हैं और इसे यहाँ का परीक्षण कर सकते हैं: https://regex101.com/r/aM3cU7/4

+0

हाँ! मेरे पास पहले से ही इमोटिकॉन चयन काम कर रहा है लेकिन यहां की कुंजी मेरे मौजूदा रेगेक्स के अंत में '(? = \ S | [\! \। \, \?] | $) जोड़ रही है। धन्यवाद! –

+0

मेरे रेगेक्स डेमो को यहां जोड़ों के साथ अपडेट किया गया: http://regexr.com/3a91e –

+3

'(' या ') 'से मेल खाने पर आपको यह भी जांचना चाहिए कि यह ब्रांड्स के वैध सेट का हिस्सा नहीं है, उदाहरण के लिए आप डॉन नहीं करते हैं यह '8)' इमोटिकॉन से मेल नहीं करना चाहता: 'ब्ला ब्ला बग (आईओएस 8 पर पुन: उत्पन्न) '। संक्षेप में, यह वास्तव में कुछ नहीं है जिसे आप रेगेक्स के साथ अच्छी तरह से संभाल सकते हैं। –

1

मैं:

(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p) 

आप कार्रवाई में यह एक डेमो यहाँ के साथ खेल सकते हैं:

पूरे regex मैं सभी इमोटिकॉन्स के लिए उपयोग कर रहा हूँ विशाल इसलिए यहाँ है एक नीचे trimed संस्करण है, मान लें कि इन इमोटिकॉन्स आमतौर पर पहले और बाद में रिक्त स्थान के साथ उपयोग किए जाएंगे। फिर \s जो हो सकता है वह हो सकता है, क्योंकि यह एक सफेद स्थान का प्रतिनिधित्व करता है।

फिर अपने रेगुलर एक्सप्रेशन से बन

\s+(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)\s 
1

आप जावास्क्रिप्ट का उपयोग कर रहे के बाद से एक positive look-ahead for a space

([\:\<]-?[)(|\\/pP3D])(?:(?=\s)) 
|  |  |   | 
|  |  |   | 
|  |  |   |-> match last separating space 
|  |  |-> match last part of the emot 
|  |-> it may have a `-` or not 
|-> first part of the emoticon 

बनाना होगा, और आप arounds देखने के लिए पहुँच नहीं है:

/([\:\<]-?[)|\\/pP3D])(\s|$)/g.exec('hi :) ;D'); 

और उसके बाद केवल splice() परिणामी सरणी अपनी अंतिम प्रविष्टि से बाहर (वें पेंसिल: पर के सबसे शायद एक अंतरिक्ष)

0

आप रिक्ति के बारे में regex देखो के arounds चाहते हैं।एक अन्य सवाल का जवाब यहाँ एक सकारात्मक देखो आगे का सुझाव दिया, हालांकि मैं डबल नकारात्मक जाना चाहते हैं:

(?<!\S)(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)(?!\S) 

JavaScript का समर्थन नहीं करता है (?<!pattern), look-behind can be mimicked:

test_string.replace(/(\S)?(\:\)|\:\(|<3|\:\/|\:-\/|\:\||\:p)(?!\S)/, 
        function($0, $1) { return $1 ? $0 : replacement_text; }); 

सभी मैं अपने कोड उपसर्ग था था (?<!\S) के साथ (?!\S) के साथ सामने और प्रत्यय में। उपसर्ग यह सुनिश्चित करता है कि आप गैर-व्हाइटस्पेस वर्ण का पालन न करें, इसलिए केवल वैध प्रमुख प्रविष्टियां रिक्त स्थान या कुछ भी नहीं हैं (रेखा की शुरुआत)। प्रत्यय एक ही चीज करता है, यह सुनिश्चित करता है कि आप गैर-व्हाइटस्पेस चरित्र के बाद नहीं हैं। यह more thorough regex walk-through भी देखें।

प्रश्न की टिप्पणियों में से एक स्वयं ही \b (शब्द सीमा) मार्कर का सुझाव दे रहा था। मैं इनकी सिफारिश नहीं करता हूं। वास्तव में, यह सुझाव आप जो चाहते हैं उसके विपरीत करेंगे; \b:/ वास्तव में http:// से मेल खाता है क्योंकि p और : के बीच एक शब्द सीमा है। इस तरह की तर्क \B (शब्द सीमा नहीं) का सुझाव देगा, उदाहरण के लिए \B:/\B। यह अधिक पोर्टेबल है (यह बहुत सारे रेगेक्स पार्सर्स के साथ काम करता है जबकि देखो-आसपास नहीं है), और आप इसे उस मामले में चुन सकते हैं, लेकिन मैं लुक-आसपास पसंद करता हूं।

+0

मैं जावास्क्रिप्ट का उपयोग कर रहा हूं और lookbehinds जेएस में समर्थित नहीं हैं :( –

+0

@ChrisBarr आह, अच्छा बिंदु। प्रतिस्थापन कॉल के लिए फ़ंक्शन का उपयोग करके हल किया गया। मैंने जो संपादन किया है उसे देखें। –

संबंधित मुद्दे