it-swarm.com.de

Javascript camelCase in reguläre Form

Ich habe versucht, einen JavaScript-Regex-Befehl zu erhalten, um etwas wie thisString in This String umzuwandeln, aber das nächste, was ich bekommen habe, ist das Ersetzen eines Buchstabens, was zu etwas wie Thi String oder This tring führt. Irgendwelche Ideen?

Um zu verdeutlichen, dass ich mit der Einfachheit der Großschreibung eines Briefs umgehen kann, bin ich mit RegEx nicht so stark, und somethingLikeThis spreche in something Like This, wo ich Probleme habe.

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

zeigt an 

This String Is Good

(function() {

  var $textbox = $('#textbox'),
    $result = $('#result'),
    splitter = function() {
      $result.html($textbox.val()
        // insert a space before all caps
        .replace(/([A-Z])/g, ' $1')
        // uppercase the first character
        .replace(/^./, function(str) {
          return str.toUpperCase();
        }));
    };

  $textbox.on('input', splitter);
  
  splitter();
}());
#result {
  margin-top: 10px;
  padding-top: 10px;
  border-top: solid 1px #c3c3c3;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div>
  Text to split
  <input id="textbox" value="thisStringIsGood" />
</div>

<div id="result"></div>

317
Vincent Robert

Ich hatte kein Interesse daran, insbesondere beim Umgang mit Sequenzen von Hauptstädten, wie z. B. bei xmlHTTPRequest. Die aufgelisteten Funktionen würden "Xml H T T P Request" oder "Xml HTTPRequest" erzeugen, meine erzeugt "Xml HTTP Request".

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(); })
}

Es gibt auch eine String.prototype-Version in einer Gist .

80
Matt Wiebe

Dies kann mit regex lookahead ( live demo ) kurz gemacht werden:

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

(Ich dachte, dass die Variable g (global) notwendig ist, aber seltsamerweise ist dies in diesem speziellen Fall nicht der Fall.)

Durch die Verwendung von Lookahead mit split wird sichergestellt, dass der übereinstimmende Großbuchstabe nicht verbraucht wird, und der Umgang mit einem führenden Leerzeichen wird vermieden, wenn Sie mit UpperCamelCase umgehen müssen. Um den ersten Buchstaben von jedem groß zu schreiben, können Sie Folgendes verwenden:

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

Die Arraymethode map ist eine ES5-Funktion. Sie können sie jedoch in älteren Browsern mit etwas Code von MDC verwenden. Alternativ können Sie die Array-Elemente mit einer for-Schleife durchlaufen.

18
PleaseStand

Ich denke, das sollte sowohl mit aufeinanderfolgenden Großbuchstaben als auch mit einfachem camelCase umgehen können.

Zum Beispiel: someVariable => someVariable, aber ABCCode! = A B C Code. 

Der folgende reguläre Ausdruck funktioniert an Ihrem Beispiel, aber auch am häufigsten, um Abkürzungen in camcelCase darzustellen.

"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"

Sie können auch wie oben beschrieben anpassen, um den ersten Buchstaben zu aktivieren.

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

weltraumkamera ("Etwas wie" ")

// Rückgabewert: So etwas

8
kennebec

Eine Lösung, die auch Zahlen behandelt:

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 + ' ';
          }
       )
   }

Hier getestet [JSFiddle, keine Bibliothek. Nicht versucht IE]; sollte ziemlich stabil sein.

4
SamGoody

Lodash geht das gut mit _.startCase()

4
Lawrence Chang

Meine Version

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"
0
pykiss

Wenn Sie sich nicht für ältere Browser interessieren (oder die Verwendung einer Fallback-reduktions-Funktion für sie nicht stört), können sogar Zeichenfolgen wie 'xmlHTTPRequest' aufgeteilt werden (aber sicherlich nicht '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(' ');
}

Probieren Sie diese Lösung hier aus -

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;
0
M3ghana