बड़े अक्षरों से पहले जगह डालें


95

मेरे पास एक तार है "MySites"। मैं Myऔर के बीच एक जगह रखना चाहता हूं Sites

मैं इसे jQuery या जावास्क्रिप्ट में कैसे कर सकता हूं?


1
क्या आप कुछ और विवरण प्रदान कर सकते हैं? जिन स्ट्रिंग्स को आप अलग करना चाहते हैं, उनका सामान्य रूप क्या है? यदि यह केवल एक ही तार है, तो क्यों न केवल मैन्युअल रूप से स्थान रखा जाए?
प्‍वाइंट्स

2
कृपया और अधिक सटीक रहें, मुझे नहीं लगता कि कोई भी यह समझ सकता है कि आप क्या पूछ रहे हैं
क्लेमेंट हेरमैन

1
उस पैटर्न को परिभाषित करें जो इसे मेल खाना चाहिए, जैसे "एक स्थान जब यह स्ट्रिंग में 'मेरा'
ढूंढता है

"माईसाइट्स के बीच"। आप 1 चीज़ के बीच जगह कैसे बना सकते हैं? मुझे लगता है कि आप आउटपुट के रूप में "मेरी साइटें" चाहते हैं।
रॉकेट हज़मत

#meagar - अच्छी टिप्पणी (कटाक्ष)। क्या आपको कभी यह नहीं सिखाया गया कि यदि आपके पास कहने के लिए कुछ भी अच्छा नहीं है, तो कुछ भी न कहें?
कारिनलिनचिन

जवाबों:


163

आप बस हर अपरकेस चरित्र से पहले एक स्थान जोड़ सकते हैं और अग्रणी और अनुगामी रिक्त स्थान को ट्रिम कर सकते हैं

s = s.replace(/([A-Z])/g, ' $1').trim()

यह "1AndAbove" के लिए भी काम करता है। दूसरा उपाय नहीं। धन्यवाद!!
देवासव

1
यह समरूपों के लिए "विफल" है, हम इसे 2 या अधिक लगातार कैप के लिए कार्य करने के लिए कैसे रोक सकते हैं?
टोनी मिशेल क्यूबेट

3
आसान @ToniMichelCaubet, इस तरह regex संशोधित: /([A-Z]+)/g। + यह सुनिश्चित करेगा कि आप यथासंभव अधिक से अधिक बड़े अक्षरों का मिलान करें।
11:

इस कोड में आपको '[AZ]' को घेरने के लिए उपयोग किए जाने वाले कोष्ठक क्यों हैं?
क्रिस्टीना बेस्लेर

@ क्रिस्टीना कोष्ठक का कहना है कि 'मैं एक चर हूँ'। कोष्ठक के बिना, यह 'MySites' के लिए उत्तर '$ 1y $ 1ites' देता है
user2051552

127

यह एक निचले मामले के चरित्र की प्रत्येक घटना को पाएगा, जिसके बाद एक ऊपरी मामले का चरित्र आएगा, और उनके बीच एक स्थान सम्मिलित होगा:

s = s.replace(/([a-z])([A-Z])/g, '$1 $2');

विशेष मामलों के लिए जब 2 लगातार बड़े अक्षर आते हैं (उदाहरण: ThisIsATest) नीचे अतिरिक्त कोड जोड़ें:

 s = s.replace(/([A-Z])([A-Z])/g, '$1 $2');

3
बस एक चेतावनी, यह एकल अक्षरों के लिए विफल रहता है "ThisIsATest" का परिणाम "यह सबसे अच्छा है"।
सेरेस

3
@Ceres: अच्छी बात है। उस मामले को किसी भी पूंजी से पहले एक जगह डालने के बजाय नियंत्रित किया जा सकता है जो कि पहला चरित्र नहीं है, लेकिन आपके पास अभी भी ऐसे मामले हैं जिन्हें शब्द पहचान के बिना नियंत्रित नहीं किया जा सकता है, जैसे "RunThisSQLQuery"
गुफा

1
"ThisIsATest" के लिए - ('RunThisSQLQuery' की गिनती नहीं करते हुए) आप ऐसा कर सकते हैं: str.replace (/ ([AZ]) / g, '$ 1')। ट्रिम ()
carinlynchin

प्रतिभाशाली! धन्यवाद!
एमी श्राइबर

21

क्या मैं वर्तमान में स्वीकृत उत्तर के लिए एक मामूली संपादन का सुझाव दे सकता हूं:

function insertSpaces(string) {
    string = string.replace(/([a-z])([A-Z])/g, '$1 $2');
    string = string.replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')
    return string;
}

इस का मतलब है कि:

ACROText -> ACRO Text
UserNameTest -> User Name Test

यदि आप db कॉलम नामों के साथ काम कर रहे हैं, तो यह थोड़ा अधिक उपयोगी हो सकता है (और कुछ चीजों के लिए समरूपी का उपयोग कर रहे हैं)


1
यह पूरी तरह से काम करता है जो मुझे चाहिए था। इसने पूरी तरह से बड़े अक्षरों के बीच एक स्थान जोड़ा है, लेकिन एक साथ जोड़कर रखा है।
ताकतवर_मोटी

6

इसमें प्रत्येक कैपिटल लेटर के बीच एक स्पेस डालना चाहिए जो कि कैपिटल लेटर से पहले नहीं था।

var myString = "MySites"
var newString = "";
var wasUpper = false;
for (var i = 0; i < myString.length; i++)
{
    if (!wasUpper && myString[i] == myString.toUpperCase()[i])
    {
        newString = newString + " ";
        wasUpper = true;
    }
    else
    {
        wasUpper = false;
    }
    newString = newString + myString[i];
}

newStringआप चाहते हैं मूल्य होगा इसके अलावा, यदि आप regex का उपयोग करके अपने कोड को छोटा करना चाहते हैं, तो आप जावास्क्रिप्ट कैमलस से रेगुलर फॉर्म में निम्न कोड का उपयोग कर सकते हैं

"thisStringIsGood"
    // insert a space before all caps
    .replace(/([A-Z])/g, ' $1')
    // uppercase the first character
    .replace(/^./, function(str){ return str.toUpperCase(); })


2

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

str = str
  .replace(/(_|-)/g, ' ')
  .trim()
  .replace(/\w\S*/g, function(str) {
    return str.charAt(0).toUpperCase() + str.substr(1)
  })   
  .replace(/([a-z])([A-Z])/g, '$1 $2')
  .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')   

यहाँ एक JSField है जहाँ आप यह देखने के लिए अपनी स्ट्रिंग का परीक्षण कर सकते हैं कि क्या यह आपकी आवश्यकताओं को पूरा करता है: https://jsfiddle.net/thomastasa/5236dv8t/85/


उदाहरण:

  • "yourStringHere" -> "आपका स्ट्रिंग यहाँ"
  • "एक और स्ट्रिंग" -> "एक और स्ट्रिंग यहाँ"
  • "Someones_string" -> "Someones String"
  • "एक और स्ट्रिंग-यहाँ" -> "एक और स्ट्रिंग यहाँ"
  • "myAWESOMEString" -> "मेरे भयानक स्ट्रिंग"

1

आप उपयोग कर सकते हैं String#split()और पूंजीकृत वर्णमाला के लिए एक नज़र आगे ( [A-Z]) और फिर Array#join()एक स्थान के साथ सरणी:

let stringCamelCase = "MySites";

let string = stringCamelCase.split(/(?=[A-Z])/).join(" ");

console.log(string)

या, स्ट्रिंग ऑब्जेक्ट फ़ंक्शन के रूप में:

String.prototype.cC2SC = function() {
  return this.split(/(?=[A-Z])/).join(" ");
}

console.log("MyCamelCase".cC2SC());


1

एक एकल रेगेक्स की जगह (ट्रिम्स या जॉइन के बिना) जो किसी भी वर्ण को अक्षर [a-z]या नहीं की अनुमति देता है [A-Z]

const str = "MySites";
str.replace(/(?<!^)([A-Z])/, " $1"); // -> "My Sites"

आप (?<!^) यहाँ पीछे देखने के बारे में अधिक जाँच कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.