2013-06-23 7 views
14

रखें मेरे पास स्ट्रिंग्स का एक सेट है जिसे मुझे प्रतिस्थापित करने की आवश्यकता है, लेकिन मुझे अक्षरों का केस रखना होगा। इनपुट शब्द और आउटपुट शब्द दोनों एक ही लंबाई के हैं।टेक्स्ट बदलें लेकिन केस

उदाहरण के लिए, अगर मैं "Qwer" के साथ "एबीसीडी" की जगह की जरूरत है, तो निम्न होना चाहिए:

"AbcD" translates to "QweR" 
"abCd" translates to "qwEr" 

और इतने पर।

अभी मैं जावास्क्रिप्ट के replace का उपयोग कर रहा हूं, लेकिन अनुवाद पर पूंजी अक्षरों को खो दिया गया है।

r = new RegExp("(" + 'asdf' + ")" , 'gi'); 
"oooAsdFoooo".replace(r, "qwer"); 

किसी भी मदद की सराहना की जाएगी।

+0

लक्ष्य स्ट्रिंग और प्रतिस्थापन ज्ञात हैं या वे गतिशील होंगे? – pvnarula

+0

क्षमा करें, मैं आपके प्रश्न को समझ नहीं पा रहा हूं। लेकिन यह मामला है: मैं उपयोगकर्ता द्वारा दर्ज एक पाठ लिख रहा हूँ। मेरे पास नियमों की एक सूची है, जैसे "सीए" "केबी" में स्थानांतरित होती है, लेकिन मुझे पूंजी अक्षरों को रखने की आवश्यकता है, इसलिए "सीए" "केबी" में स्थानांतरित होता है। –

+1

मैं इसे 2 चरणों में करूँगा, पहले "oooAsdFoooo"। खोज (आर) जो सूचकांक देता है और फिर मामले को संभालता है। लेकिन अगर मैं रेगेक्स केवल – bert

उत्तर

5

यहाँ एक सहायक है:

function matchCase(text, pattern) { 
    var result = ''; 

    for(var i = 0; i < text.length; i++) { 
     var c = text.charAt(i); 
     var p = pattern.charCodeAt(i); 

     if(p >= 65 && p < 65 + 26) { 
      result += c.toUpperCase(); 
     } else { 
      result += c.toLowerCase(); 
     } 
    } 

    return result; 
} 

तो फिर तुम सिर्फ कर सकते हैं:

"oooAsdFoooo".replace(r, function(match) { 
    return matchCase("qwer", match); 
}); 
+1

यह अच्छा है लेकिन केवल ASCII के लिए काम करता है। :) – Tomalak

+2

@Tomalak: यदि आवश्यक हो, परिवर्तन 'p> = 65 && पी <65 + 26'' UPPERCASE.test (पी) ', परिवर्तन' charCodeAt' को 'charAt' के लिए, और परिभाषित' वर अपरकेस =/[whateverletters ] /; '। – Ryan

+0

या शायद 'toLocale {ऊपरी, निचला} केस'। – Ryan

1
String.prototype.translateCaseSensitive = function (fromAlphabet, toAlphabet) { 
    var fromAlphabet = fromAlphabet.toLowerCase(), 
     toAlphabet = toAlphabet.toLowerCase(), 
     re = new RegExp("[" + fromAlphabet + "]", "gi"); 

    return this.replace(re, function (char) { 
     var charLower = char.toLowerCase(), 
      idx = fromAlphabet.indexOf(charLower); 

     if (idx > -1) { 
      if (char === charLower) { 
       return toAlphabet[idx]; 
      } else { 
       return toAlphabet[idx].toUpperCase(); 
      } 
     } else { 
      return char; 
     } 
    }); 
}; 

और

"AbcD".translateCaseSensitive("abcdefg", "qwertyu") 

वापस आ जाएगी:

"QweR" 
+1

हालांकि यह अलग-अलग वर्णों को प्रतिस्थापित करता है - मूल प्रश्न सबस्ट्रिंग को बदलने के बारे में बात कर रहा है।आपके exmaple में, इनपुट स्ट्रिंग में "abcdefg" नहीं है, इसलिए कुछ भी प्रतिस्थापित नहीं किया जाना चाहिए। – jcsanyi

+0

@jcsanyi एचएम। मैं इसे इस तरह समझ में नहीं आया। लेकिन यह संभव है कि आप सही हैं। – Tomalak

1

आप इस तरह के

if(!String.prototype.myreplace){ 
String.prototype.myreplace = (function(obj){ 
    return this.replace(/[a-z]{1,1}/gi,function(a,b){ 
     var r = obj[a.toLowerCase()] || a; 
     return a.charCodeAt(0) > 96? r.toLowerCase() : r.toUpperCase(); 
    }); 
}); 
} 

के रूप में यह एक उद्देश्य यह है कि विभिन्न पत्र नक्शे में ले जाता है अपने स्वयं के बदलने के समारोह बना सकते हैं। और यह इस प्रकार

var obj = {a:'q',b:'t',c:'w'}; 

    var s = 'AbCdea'; 
    var n = s.myreplace(obj); 
    console.log(n); 

इसका मतलब है आप अलग-अलग मैपिंग के साथ में विभिन्न वस्तुओं गुजारें सकता अगर जरूरत हो इस तरह कहा जा सकता है। यहां एक सरल fiddle एक उदाहरण दिखा रहा है (नोट करें कि ऑब्जेक्ट सभी लोअरकेस है लेकिन फ़ंक्शन स्वयं स्ट्रिंग के मामले में भी दिखता है)

0

रायन ओहारा के उत्तर पर विस्तार, नीचे दिया गया समाधान charCodes और उन मुद्दों का उपयोग करने से बचाता है जो शायद उनका उपयोग करने में सामना करना पड़ा। यह भी सुनिश्चित करता है कि तार अलग-अलग लंबाई के होते समय प्रतिस्थापन पूर्ण हो जाता है।

function enforceLength(text, pattern, result) { 
    if (text.length > result.length) { 
    result = result.concat(text.substring(result.length, text.length)); 
    } 

    if (pattern.length > text.length) { 
    result = result.substring(0, text.length); 
    } 

    return result; 
} 

function matchCase(text, pattern){ 
    var result = ''; 

    for (var i =0; i < pattern.length; i++){ 
    var c = text.charAt(i); 
    var p = pattern.charAt(i); 

    if(p === p.toUpperCase()) { 
     result += c.toUpperCase(); 
    } else { 
     result += c.toLowerCase(); 
    } 
    } 
    return enforceLength(text, pattern, result); 
} 
1

मामले को संरक्षित करते समय इसे प्रतिस्थापित करना चाहिए। अगर किसी को इस समाधान में कोई दोष मिल जाए तो कृपया मुझे बताएं। आशा है कि ये आपकी मदद करेगा। धन्यवाद!

function myReplace(str, before, after) { 

     var match=function(before,after){ 
     after=after.split(''); 
     for(var i=0;i<before.length;i++) 
      { 

      if(before.charAt(i)==before[i].toUpperCase()) 
       { 
       after[i]=after[i].toUpperCase(); 
       } 
      else if(before.charAt(i)==before[i].toLowerCase()) 
       { 
       after[i]=after[i].toLowerCase(); 
       } 
      return after.join(''); 
      } 

     }; 
      console.log(before,match(before,after)); 
      str =str.replace(before,match(before,after)); 


     return str; 
    } 

    myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped"); 
संबंधित मुद्दे