2010-01-12 12 views
5

मैं एक नियमित अभिव्यक्ति के साथ स्ट्रिंग में डुप्लिकेट को फ़िल्टर करने का तरीका जानने का प्रयास कर रहा हूं, जहां स्ट्रिंग अल्पविराम से अलग है। मैं इसे जावास्क्रिप्ट में करना चाहता हूं, लेकिन मैं बैक-रेफरेंस का उपयोग करने के तरीके के साथ पकड़ा जा रहा हूं।एक अल्पविराम से अलग सूची में डुप्लिकेट को रीगेक्स के साथ हटा रहा है?

उदाहरण के लिए:

1,1,1,2,2,3,3,3,3,4,4,4,5 

बन जाता है:

1,2,3,4,5 

या:

a,b,b,said,said, t, u, ugly, ugly 

हो जाता है

a,b,said,t,u,ugly 

उत्तर

8

जब आप इसे जावास्क्रिप्ट कोड में कर सकते हैं तो regex का उपयोग क्यों करें? यहाँ नमूना कोड है (गन्दा हालांकि):

var input = 'a,b,b,said,said, t, u, ugly, ugly'; 
var splitted = input.split(','); 
var collector = {}; 
for (i = 0; i < splitted.length; i++) { 
    key = splitted[i].replace(/^\s*/, "").replace(/\s*$/, ""); 
    collector[key] = true; 
} 
var out = []; 
for (var key in collector) { 
    out.push(key); 
} 
var output = out.join(','); // output will be 'a,b,said,t,u,ugly' 

पी/एस: उस के लिए लूप में एक regex टोकन ट्रिम करने के लिए है, उन्हें अद्वितीय

+1

+1 को समझाकर लोगों को समझने में मदद करनी चाहिए, इसमें डुप्लिकेट को हटाने का अतिरिक्त लाभ है, भले ही वे संगत न हों। कुछ ऐसा जो बहुत मुश्किल होगा यदि रेगेक्स में कोई टी असंभव नहीं है। –

+0

नियमित अभिव्यक्ति अक्सर उन समस्याओं के लिए अधिक सुरुचिपूर्ण होती हैं जिन्हें वे आसानी से हल कर सकते हैं।कौन सा बेहतर है - कोड की एक दर्जन रेखाएं, या रेगेक्स के दर्जन अक्षर? –

+0

मैं आपको यह जांचने की सलाह दूंगा कि ''lor' में 'collector.hasOwnProperty (key)' के अंदर ''' लूप में, क्योंकि अगर कोई 'ऑब्जेक्ट.प्रोटोटाइप' बढ़ाता है तो यह आपके कोड को तोड़ देगा। – CMS

0

यहाँ एक उदाहरण है:

s/,([^,]+),\1/,$1/g; 

पर्ल regex प्रतिस्थापन, लेकिन जो कोई वाक्य रचना जानता द्वारा जे एस शैली के लिए परिवर्तनीय होना चाहिए।

+0

ध्यान दें कि यह स्ट्रिंग की शुरुआत के आसपास सही ढंग से काम नहीं करता है - मैं इसे ठीक कर सकता हूं, लेकिन यह अस्पष्ट होगा कि रेगेक्स का मूल कैसे काम करता है। जो एक बुरी चीज है, क्योंकि यह लोगों को समझने के बिना कॉपी-पेस्ट करने के लिए प्रोत्साहित करती है। –

+0

फिर आपको –

1

बनाने के लिए नहीं आप रेगुलर एक्सप्रेशन पर जोर देते हैं, तो यहाँ है जावास्क्रिप्ट में एक उदाहरण:

"1,1,1,2,2,3,3,3,3,4,4,4,5".replace (
    /(^|,)([^,]+)(?:,\2)+(,|$)/ig, 
    function ($0, $1, $2, $3) 
    { 
     return $1 + $2 + $3; 
    } 
); 

खाली स्थान के की ट्रिमिंग को संभालने के लिए थोड़ा सा संशोधन:

"1,1,1,2,2,3,3,3,3,4,4,4,5".replace (
    /(^|,)\s*([^,]+)\s*(?:,\s*\2)+\s*(,|$)\s*/ig, 
    function ($0, $1, $2, $3) 
    { 
     return $1 + $2 + $3; 
    } 
); 

जिसके अनुसार, यह है split के माध्यम से टोकनिस के लिए बेहतर लगता है और डुप्लिकेट को संभालता है।

0

मैं इसके लिए नियमित अभिव्यक्तियों का उपयोग नहीं करता हूं।

यहां मैं जिस फ़ंक्शन का उपयोग करता हूं वह यहां है। यह अल्पविराम से अलग मूल्य वाले स्ट्रिंग को स्वीकार करता है और मूल स्ट्रिंग में स्थिति के बावजूद अद्वितीय मानों की एक सरणी देता है।

नोट: यदि आप उद्धृत मान वाले CSV स्ट्रिंग को पास करते हैं, तो स्प्लिट उद्धृत मानों के अंदर अल्पविराम का इलाज नहीं करेगा। इसलिए यदि आप असली सीएसवी को संभालना चाहते हैं, तो आप किसी तृतीय पक्ष सीएसवी पार्सर का उपयोग करने के लिए सबसे अच्छे हैं।

function GetUniqueItems(s) 
{ 
    var items=s.split(","); 

    var uniqueItems={}; 

    for (var i=0;i<items.length;i++) 
    {   
     var key=items[i]; 
     var val=items[i]; 
     uniqueItems[key]=val; 
    } 

    var result=[]; 

    for(key in uniqueItems) 
    { 
     // Assign to output result field using hasOwnProperty so we only get 
     // relevant items 
     if(uniqueItems.hasOwnProperty(key)) 
     { 
      result[result.length]=uniqueItems[key]; 
     } 
    }  
    return result; 
} 
0
जावास्क्रिप्ट regex

x="1,1,1,2,2,3,3,3,3,4,4,4,5" 

while(/(\d),\1/.test(x)) 
    x=x.replace(/(\d),\1/g,"$1") 

1,2,3,4,5 


x="a,b,b,said,said, t, u, ugly, ugly" 

while(/\s*([^,]+),\s*\1(?=,|$)/.test(x)) 
    x=x.replace(/\s*([^,]+),\s*\1(?=,|$)/g,"$1") 

a,b,said, t, u,ugly 

अच्छी तरह से नहीं परीक्षण किया साथ

, मुझे पता है कि क्या कोई मुद्दा है करते हैं।

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