In meinem Code habe ich eine Zeichenfolge basierend auf geteilt _
und das zweite Element im Array abgerufen .
var element = $(this).attr('class');
var field = element.split('_')[1];
Nimmt good_luck
und versorgt mich mit luck
. Funktioniert super!
Aber jetzt habe ich eine Klasse, die aussieht good_luck_buddy
. Wie kann ich mein Javascript dazu bringen, das zweite zu ignorieren _
und mir zu geben luck_buddy
?
Ich habe dies var field = element.split(new char [] {'_'}, 2);
in der Antwort ac # stackoverflow gefunden, aber es funktioniert nicht. Ich habe es bei jsFiddle ausprobiert ...
quelle
_
übereinstimmt, innerhalb einer Erfassungsgruppe abgeglichen wird und aus diesem Grund zur Token-Liste hinzugefügt wird."Aspect Ratio: 16:9".split(/:(.+)/)
out:["Aspect Ratio", " 16:9", ""]
": 16:9"
, befindet sich nach dem Trennzeichen nichts mehr, sodass am Ende die leere Zeichenfolge erstellt wird.Wofür benötigen Sie reguläre Ausdrücke und Arrays?
quelle
_
indem man schreibt:myString.substring( myString.indexOf('_', myString().indexOf('_') + 1) + 1 )
var str = "good_luck_buddy", res = str.split(/_(.+)/);
bekommen Sie alle Teile:console.log(res[0]); console.log(res[1]);
[ string.substring(0, string.indexOf(options.divider)), string.substring(string.indexOf(options.divider) + 1) ]
Da hast du es. Auch mit Unterstützung der variablen NadelIch vermeide RegExp um jeden Preis. Folgendes können Sie noch tun:
quelle
Ersetzen Sie die erste Instanz durch einen eindeutigen Platzhalter und teilen Sie sie von dort auf.
Dies ist nützlicher, wenn beide Seiten der Aufteilung benötigt werden.
quelle
Sie können den regulären Ausdruck wie folgt verwenden:
Sie können den zweiten Parameter verwenden, der die Grenze der Aufteilung angibt. dh: var field = element.split ('_', 1) [1];quelle
'good_luck_buddy'.split('_', 1);
kehrt gerade zurück['good']
(:?.*)
eine nicht erfassende Gruppe sein? Wenn ja, sollte es sein(?:.*)
, aber wenn Sie es korrigieren, werden Sie feststellen, dass es nicht mehr funktioniert.(:?.*)
Entspricht einem optionalen:
Zeichen, gefolgt von null oder mehr Zeichen. Diese Lösung funktioniert letztendlich aus dem gleichen Grund, aus dem @ MarkF's funktioniert: Alles nach dem ersten_
wird zur Token-Liste hinzugefügt, da es in einer Erfassungsgruppe abgeglichen wurde. (Auch derg
Modifikator hat keine Wirkung, wenn er in einem geteiltenHeutzutage
String.prototype.split
können Sie die Anzahl der Teilungen tatsächlich begrenzen.Vorbehalt
Es funktioniert möglicherweise nicht so, wie Sie es erwarten. Ich hatte gehofft, dass der Rest der Trennzeichen einfach ignoriert wird. Wenn das Limit jedoch erreicht ist, wird die verbleibende Zeichenfolge erneut aufgeteilt, wobei der Teil nach der Aufteilung aus den Rückgabeergebnissen weggelassen wird.
Ich hatte gehofft auf:
quelle
Diese Lösung hat bei mir funktioniert
ODER
quelle
Javascript hat
String.split
leider keine Möglichkeit, die tatsächliche Anzahl der Teilungen zu begrenzen. Es gibt ein zweites Argument, das angibt, wie viele der tatsächlich geteilten Elemente zurückgegeben werden, was in Ihrem Fall nicht hilfreich ist. Die Lösung wäre, die Zeichenfolge zu teilen, das erste Element zu verschieben und dann die verbleibenden Elemente wieder zu verbinden ::quelle
Ich brauche die beiden Teile des Strings, also hilft mir Regex Lookbehind dabei.
quelle
Mit Hilfe der Destrukturierungszuordnung kann es besser lesbar sein:
quelle
Schnellste Lösung?
Ich habe einige Benchmarks durchgeführt , und diese Lösung hat enorm gewonnen: 1
Leistungsvergleich mit anderen Lösungen
Der einzige enge Anwärter war dieselbe Codezeile, außer dass
substr
anstelle vonslice
.Andere Lösungen, die ich mit
split
oder ohneRegExp
s versucht habe, hatten einen großen Leistungseinbruch und waren etwa 2 Größenordnungen langsamer. Die Verwendungjoin
der Ergebnisse vonsplit
fügt natürlich eine zusätzliche Leistungsstrafe hinzu.Warum sind sie langsamer? Jedes Mal, wenn ein neues Objekt oder Array erstellt werden muss, muss JS einen Speicherblock vom Betriebssystem anfordern. Dieser Prozess ist sehr langsam.
Hier sind einige allgemeine Richtlinien für den Fall, dass Sie Benchmarks verfolgen:
{}
oder Arrays[]
(wie die, diesplit
erstellt werden) kosten viel Leistung.RegExp
Suchen sind komplizierter und daher langsamer als Zeichenfolgensuchen.Über die erste Instanz hinaus entfernen
Hier ist eine Lösung, die bis zur n-ten Instanz reicht. Es ist nicht ganz so schnell, aber auf die Frage des OP
gobble(element, '_', 1)
ist es immer noch> 2x schneller als eineRegExp
odersplit
Lösung und kann mehr:Mit der obigen Definition
gobble('path/to/file.txt', '/')
würde der Name der Datei angegeben undgobble('prefix_category_item', '_', 1)
das Präfix wie bei der ersten Lösung in dieser Antwort entfernt.quelle
Die Lösung von Mark F ist fantastisch, wird aber von alten Browsern nicht unterstützt. Die Lösung von Kennebec ist fantastisch und wird von alten Browsern unterstützt, unterstützt jedoch keinen regulären Ausdruck.
Wenn Sie also nach einer Lösung suchen, die Ihre Zeichenfolge nur einmal aufteilt, die von alten Browsern unterstützt wird und Regex unterstützt, ist hier meine Lösung:
quelle
Für Anfänger wie mich, die nicht an regulären Ausdruck gewöhnt sind, hat diese Problemumgehungslösung funktioniert:
Die Methode Slice () extrahiert einen Teil einer Zeichenfolge und gibt eine neue Zeichenfolge zurück. Die Methode indexOf () gibt die Position des ersten gefundenen Auftretens eines angegebenen Werts in einer Zeichenfolge zurück.
quelle
Verwenden Sie die Zeichenfolgenmethode
replace()
mit einem regulären Ausdruck :Dieser reguläre Ausdruck entspricht 0 oder mehr Zeichen vor dem ersten
_
und dem_
selbst. Die Übereinstimmung wird dann durch eine leere Zeichenfolge ersetzt.quelle
document.body.innerHTML
Teil hier ist völlig nutzlos.document.body.innerHTML
?document.body
hängt davon ab, ob das DOM vorhanden ist, und es funktioniert nicht in einer reinen JavaScript-Umgebung.console.log
reicht für diesen Zweck aus oder belassen Sie das Ergebnis einfach in einer Variablen zur Überprüfung.Das hat bei Chrome + FF bei mir funktioniert:
Wenn Sie auch den Schlüssel benötigen, versuchen Sie Folgendes:
quelle
Hier ist ein RegExp, das den Trick macht.
Zuerst wird das Match gezwungen, mit dem '^' von vorne zu beginnen. Dann stimmt es mit einer beliebigen Anzahl von Zeichen überein, die nicht '_' sind, dh alle Zeichen vor dem ersten '_'.
Das '?' bedeutet, dass eine minimale Anzahl von Zeichen, mit denen das gesamte Muster übereinstimmt, mit dem '. *?' weil es von '_' gefolgt wird, das dann als letztes Zeichen in das Match aufgenommen wird.
Daher verwendet dieses split () ein passendes Teil wie seinen 'Splitter' und entfernt es aus den Ergebnissen. Es entfernt also alles bis einschließlich des ersten '_' und gibt Ihnen den Rest als zweites Element des Ergebnisses. Das erste Element ist "", das das Teil vor dem übereinstimmenden Teil darstellt. Es ist "", weil das Match von vorne beginnt.
Es gibt andere RegExps, die genauso gut funktionieren wie /_(.*)/, die Chandu in einer früheren Antwort gegeben hat.
Das /^.*?_/ hat den Vorteil, dass Sie verstehen können, was es tut, ohne über die besondere Rolle Bescheid wissen zu müssen, die Erfassungsgruppen mit replace () spielen.
quelle