2016-09-20 5 views
2

Ich habe Probleme mit REGEX, das versucht, einen zu bauen, der den ersten Buchstaben eines Wortes und jeden anderen Großbuchstaben dieses Wortes und jeden ersten Buchstaben einschließlich des beliebigen Kapitals abrufen würde Brief in dem gleichen WortRegex jedes ersten Zeichens und jedes Kapitels im Wort

"WelcomeBack to NorthAmerica a great place to be" = WBTNAAGPTB 
"WelcomeBackAgain to NorthAmerica it's nice here" = WBATNAINH 
"Welcome to the NFL, RedSkins-Dolphins play today" = WTTNFLRSDPT 

versucht, diese juus die ersten 2 Spiele zu bekommen:

/([A-Z])|\b([a-zA-Z])/g 

Jede Hilfe ist willkommen, dank

+0

Ist es JavaScript? –

+1

Siehe hierzu http://stackoverflow.com/questions/7573817/get-the-first-letter-of-each-word-in-a-string-using-regex – Sampad

+0

Ich habe gesehen, Regex für jede Sprache anders formuliert, also habe ich nur die Sprache mitgerechnet, die ich benutze. Aber die Frage ist hauptsächlich REGEX – GV3

Antwort

3

Sie benötigen einen regulären Ausdruck, dass will entsprechen alle Großbuchstaben und diese Kleinbuchstaben, die zu Beginn der Zeichenfolge oder nach einem Leerzeichen angezeigt:

var re = /[A-Z]+|(?:^|\s)([a-z])/g; 
 
var strs = ["WelcomeBack to NorthAmerica a great place to be", "WelcomeBackAgain to NorthAmerica it's nice here", "Welcome to the NFL, RedSkins-Dolphins play today"]; 
 
for (var s of strs) { 
 
    var res = ""; 
 
    while((m = re.exec(s)) !== null) { 
 
    if (m[1]) { 
 
     res += m[1].toUpperCase(); 
 
    } else { 
 
     res += m[0]; 
 
    } 
 
    } 
 
    console.log(res); 
 
}

Hier [A-Z]+|(^|\s)([a-z]) Spiele mehrere Vorkommen:

  • [A-Z]+ - 1 oder mehr ASCII-Großbuchstaben
  • | - oder
  • (?:^|\s) - Beginn der Zeichenfolge (^) oder ein Leerzeichen (\s)
  • ([a-z]) - Gruppe 1: ein Klein ASCII Buchstaben.
+1

Der Code könnte ein kleines bisschen vereinfacht werden, indem auch die Großbuchstaben erfasst werden, was bedeutet, dass die' if' Anweisung kann entfernt werden, da die Schleife einfach den gesamten aufgenommenen Inhalt in eine Zeichenkette ('m.slice (1) .find (x => x)') sammelt, gefolgt von einer Oberkaskierung des gesamten Ergebnisses. Dies schneidet 4 Zeilen aus der 'while' loop und somit die' for' Schleife wird fast halb so groß sein. – vlaz

+1

Danke, @wiktor, es funktioniert wie ein Charme.Und super Erklärung! – GV3

1

Try this:

let s = "WelcomeBack to NorthAmerica a great place to be"; 
s = s.match(/([A-Z])|(^|\s)(\w)/g); // -> ["W","B"," t", " N"...] 
s = s.join('');      // -> 'WB t N...' 
s = s.replace(/\s/g, '');    // -> 'WBtN...' 
return s.toUpperCase();    // -> 'WBT ...' 

/(?:([A-Z])|\b(\w))/g Matches jeden Großbuchstaben ([A-Z]) OR | jeder Brief (\w) die \s den Anfang des Strings ^ oder ein Leerzeichen folgt.

(I nicht die Leerzeichen aus irgendeinem Grund erfasst, daher der replace Schritt nicht werden lassen könnte. Sicherlich gibt es bessere Tricks, aber dies ist das am meisten lesbar ich finde.)

+0

Wenn das so einfach wäre, könnte der ganze Code ein Einzeiler sein Ich habe diesen Ansatz bereits versucht, bevor ich meine Antwort gepostet habe. Der zweite Beispielstring sollte 'WBATNAINH' zurückgeben und [Ihr Code gibt' WBATNAISNH' zurück (https://jsfiddle.net/x5vga5s1/). –

+0

Sie müssen das nicht tun Wickeln Sie die einfangenden Gruppen in eine andere Gruppe, damit das OR funktioniert hout es. – vlaz

+2

* Ich konnte nicht die Whitespace nicht aus irgendeinem Grund erfasst werden * - der Grund ist, dass JS Regex-Engine Lookbehinds nicht unterstützt :( –

1

Sie regex verwenden können, als : /\b[a-z]|[A-Z]+/g;

<html> 
 
    <head> 
 
     <title>JavaScript String match() Method</title> 
 
    </head> 
 
    <body> 
 
     <script type="text/javascript"> 
 
     var str = "WelcomeBack to NorthAmerica a great place to be"; 
 
     var re = /\b[a-z]|[A-Z]+/g; 
 
     var found = str.match(re); 
 
     found.forEach(function(item, index) { 
 
      found[index] = item.toUpperCase(); 
 
     }); 
 
      document.write(found.join('')); 
 
     </script> 
 
     
 
    </body> 
 
</html>

+1

T Mit 'WelcomeBackAgain to NorthAmerica ist es hier schön' und - nach einiger Bearbeitung - kommen Sie zu einer Lösung, die näher an meiner oder HumanCatford liegt. –

1

Sie können dies versuchen, wird es übernehmen auch von Whitespaces

Verwandte Themen