"ऊंट मामले" को "ऊंट प्रकरण" में कैसे बदलें?


174

मैं एक जावास्क्रिप्ट regex आदेश की तरह कुछ चालू करने के लिए प्राप्त करने की कोशिश कर रहा है "thisString"में "This String"लेकिन निकटतम मैं मिल गया है, एक पत्र की जगह की तरह कुछ में जिसके परिणामस्वरूप "Thi String"या "This tring"। कोई विचार?

स्पष्ट करने के लिए मैं एक पत्र को बड़े अक्षरों में की सादगी संभाल कर सकते हैं, मैं रेगुलर एक्सप्रेशन से साथ मजबूत बस के रूप में नहीं हूँ, और बंटवारे "somethingLikeThis"में "something Like This"वह जगह है जहाँ मैं समस्या हो रही है।



6
यह उस की नकल कैसे है। वह सब करता है जो पहले चरित्र को एक स्ट्रिंग में कैपिटल करता है, जो मैं करना चाहता हूं उसके करीब कुछ भी नहीं।
एक जादूगर ने यह

हम्म इस सवाल का एक धोखा नहीं है, लेकिन परिणाम एक ही हो सकता है। या वह नहीं है जो आप करना चाहते थे? अधिक विस्तृत?
सुपरफ्रो

रेगेक्स अभ्यास के लिए मैं RegExr या Expresso में परीक्षण करने का सुझाव देता हूं और एसओ पर सभी regex प्रश्नों को देखता हूं और उनका उत्तर देने का प्रयास करता हूं। Regexs दुनिया की सबसे सरल चीज़ नहीं है, लेकिन बस याद रखें कि यदि आपका regex आपको भ्रमित कर रहा है तो इसे अलग करें और टुकड़ों में काम करें।
josh.trow

जवाबों:


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

प्रदर्शित करता है

This String Is Good


1
अच्छा आदमी है, इसे अलग करना। बस बॉबिन की सलाह को याद रखें: stackoverflow.com/questions/1732348/…
josh.trow 21

क्या आप सुनिश्चित हैं कि यह IE के साथ संगत है? IETester7 में बस कोशिश की और एक त्रुटि मिली।
strongriley

3
यह भी जोड़ना: यदि आपके पास सभी कैप्स हैं जो आप एक साथ रखना चाहते हैं, तो आप पहले रेगेक्स को "/ ([AZ]] [az]) /" में बदल सकते हैं
jackfrster

2
"यह" -> "यह" (अवांछित उपसर्ग स्थान)। शायद इसे इसमें बदल दें: str.slice (0, 1) .toUpperCase () + str.slice (1) .replace (/ ([AZ]) / g, '$ 1')
Mark Vayngbrib

1
@ColdCerberus आप उपयोग कर सकते हैं: str.replace(/((?<!^)[A-Z](?![A-Z]))(?=\S)/g, ' $1').replace(/^./, s => s.toUpperCase() );यह परिवर्तित कर देंगे userIDकरने के लिए User IDहै, और यह भी परिवर्तित कर देंगे userIDFieldकरने के लिएUser ID Field
यूजीन माला

87

इसमें मुझे विशेष रूप से xmlHTTPRequest जैसे राजधानियों के अनुक्रमों को संभालने में एक निष्क्रिय रुचि थी। सूचीबद्ध कार्य "Xml HTTP अनुरोध" या "Xml HTTPRequest" का उत्पादन करेंगे, मेरा "Xml HTTP अनुरोध" का उत्पादन करता है।

function unCamelCase (str){
    return str
        // insert a space between lower & upper
        .replace(/([a-z])([A-Z])/g, '$1 $2')
        // space before last upper in a sequence followed by lower
        .replace(/\b([A-Z]+)([A-Z])([a-z])/, '$1 $2$3')
        // uppercase the first character
        .replace(/^./, function(str){ return str.toUpperCase(); })
}

एक जिस्ट में String.prototype संस्करण भी है ।


उसी को 2 प्रतिस्थापित कॉल के साथ प्राप्त किया जा सकता है:str.replace(/((?<!^)[A-Z](?![A-Z]))(?=\S)/g, ' $1').replace(/^./, s => s.toUpperCase() )
यूजीन माला

22

यह संक्षिप्त रूप से रेगेक्स लुकहेड ( लाइव डेमो ) के साथ किया जा सकता है :

function splitCamelCaseToString(s) {
    return s.split(/(?=[A-Z])/).join(' ');
}

(मुझे लगा कि g(वैश्विक) ध्वज आवश्यक था, लेकिन अजीब तरह से पर्याप्त है, यह इस विशेष मामले में नहीं है।)

लुकहैड का उपयोग splitयह सुनिश्चित करता है कि मिलान किए गए कैपिटल लेटर का उपभोग नहीं किया जाता है और एक प्रमुख स्थान से निपटने से बचा जाता है अगर ऊपरीकेंसेलकेस वह चीज है जिससे आपको निपटने की आवश्यकता है। प्रत्येक के पहले अक्षर को बड़ा करने के लिए, आप इसका उपयोग कर सकते हैं:

function splitCamelCaseToString(s) {
    return s.split(/(?=[A-Z])/).map(function(p) {
        return p.charAt(0).toUpperCase() + p.slice(1);
    }).join(' ');
}

mapसरणी विधि एक ES5 सुविधा है, लेकिन आप अभी भी साथ पुराने ब्राउज़र में उपयोग कर सकते हैं MDC से कुछ कोड । वैकल्पिक रूप से, आप forलूप का उपयोग करके सरणी तत्वों पर पुनरावृति कर सकते हैं ।


पहला फ़ंक्शन इसे विभाजित करता है, लेकिन पहला शब्द PascalCase नहीं करता है। दूसरा कार्य किसी भी ऊंट के मामले में विफल रहता है। : (उदाहरण के लिए 'आईडी')
Dementic

16

मुझे लगता है कि यह लगातार अपरकेस वर्णों के साथ-साथ सरल कैमलकेस को संभालने में सक्षम होना चाहिए।

उदाहरण के लिए: someVariable => someVariable, लेकिन ABCCode! = ABC कोड।

नीचे दिए गए रेगेक्स आपके उदाहरण पर काम करते हैं लेकिन कैमसेल कैस में संक्षिप्त विवरणों का प्रतिनिधित्व करते हैं।

"somethingLikeThis"
    .replace(/([a-z])([A-Z])/g, '$1 $2')
    .replace(/([A-Z])([a-z])/g, ' $1$2')
    .replace(/\ +/g, ' ') => "something Like This"

"someVariableWithABCCode"
    .replace(/([a-z])([A-Z])/g, '$1 $2')
    .replace(/([A-Z])([a-z])/g, ' $1$2')
    .replace(/\ +/g, ' ') => "some Variable With ABC Code"

आप पहले चरित्र को भुनाने के लिए ऊपर भी समायोजित कर सकते हैं।


10
function spacecamel(s){
    return s.replace(/([a-z])([A-Z])/g, '$1 $2');
}

spacecamel ( 'somethingLikeThis')

// लौटा मूल्य: कुछ इस तरह


1
अच्छा है! यह ठीक वही है जिसकी मुझे आवश्यकता थी जैसे मैं विभाजित करना चाहता था: DiscoveryChannel और HBO अन्य उत्तर मुझे डिस्कवरी चैनल और एचबीओ देते थे, लेकिन आपके उत्तर ने मेरे लिए चाल चली क्योंकि HBO रुकी थी!
एजेएस


4

एक समाधान जो संख्याओं को भी संभालता है:

function capSplit(str){
   return str.replace
      ( /(^[a-z]+)|[0-9]+|[A-Z][a-z]+|[A-Z]+(?=[A-Z][a-z]|[0-9])/g
      , function(match, first){
          if (first) match = match[0].toUpperCase() + match.substr(1);
          return match + ' ';
          }
       )
   }

यहाँ परीक्षण किया गया [JSFiddle, कोई पुस्तकालय नहीं। कोशिश नहीं की IE]; बहुत स्थिर होना चाहिए।


0

यदि आप पुराने ब्राउज़रों के बारे में परवाह नहीं करते हैं (या उनके लिए फॉलबैक कम करने वाले फ़ंक्शन का उपयोग करने में कोई आपत्ति नहीं है ), तो यह 'xmlHTTPRequest' (लेकिन निश्चित रूप से 'XMLHTTPRequest' पसंद नहीं कर सकता) की तरह तार भी विभाजित कर सकता है।

function splitCamelCase(str) {
        return str.split(/(?=[A-Z])/)
                  .reduce(function(p, c, i) {
                    if (c.length === 1) {
                        if (i === 0) {
                            p.push(c);
                        } else {
                            var last = p.pop(), ending = last.slice(-1);
                            if (ending === ending.toLowerCase()) {
                                p.push(last);
                                p.push(c);
                            } else {
                                p.push(last + c);
                            }
                        }
                    } else {
                        p.push(c.charAt(0).toUpperCase() + c.slice(1));
                    }
                    return p;
                  }, [])
                  .join(' ');
}

0

मेरा संस्करण

function camelToSpace (txt) {
  return txt
    .replace(/([^A-Z]*)([A-Z]*)([A-Z])([^A-Z]*)/g, '$1 $2 $3$4')
    .replace(/ +/g, ' ')
}
camelToSpace("camelToSpaceWithTLAStuff") //=> "camel To Space With TLA Stuff"

मैंने इस समारोह को 3000 लाइनों पर लूप में लागू किया, और राजधानी के साथ शुरू होने वाली हर पंक्ति के सामने उन स्थानों को मिला
डोमिनिक डोमान्स्की

0

इस समाधान को यहाँ आज़माएँ -

var value = "myCamelCaseText";
var newStr = '';
for (var i = 0; i < value.length; i++) {
  if (value.charAt(i) === value.charAt(i).toUpperCase()) {
    newStr = newStr + ' ' + value.charAt(i)
  } else {
    (i == 0) ? (newStr += value.charAt(i).toUpperCase()) : (newStr += value.charAt(i));
  }
}
return newStr;

-5

रेगेक्स नहीं, लेकिन इस तरह से सादे और पुरानी तकनीकों को जानने के लिए उपयोगी:

var origString = "thisString";
var newString = origString.charAt(0).toUpperCase() + origString.substring(1);

5
नहीं, सवाल "ThisString" से "This String" (एक स्थान के साथ) "ThisString" नहीं है
Pete Kirkham

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