Wie spalte ich eine Zeichenfolge, die bei einem bestimmten Zeichen bricht?

Ich habe diese Zeichenfolge

'john smith~123 Street~Apt 4~New York~NY~12345'

Mit JavaScript, was ist der schnellste Weg, um dies zu analysieren

var name = "john smith";
var street= "123 Street";
//etc...
0
hinzugefügt bearbeitet
Ansichten: 2

11 Antworten

Sie sollten sich JavaScript in substr oder Teilen , wie dies ist nicht wirklich eine Aufgabe, die für jQuery geeignet ist

0
hinzugefügt

Wenn Spliter gefunden wird dann nur

Teile es auf

else return the same string

function SplitTheString(ResultStr) {
    if (ResultStr != null) {
        var SplitChars = '~';
        if (ResultStr.indexOf(SplitChars) >= 0) {
            var DtlStr = ResultStr.split(SplitChars);
            var name  = DtlStr[0];
            var street = DtlStr[1];
        }
    }
}
0
hinzugefügt

Sie können split verwenden, um den Text zu teilen.

Alternativ können Sie auch match wie folgt verwenden

<div class="snippet" data-lang="js" data-hide="false"> <div class="snippet-code">

var str = 'john smith~123 Street~Apt 4~New York~NY~12345';
matches = str.match(/[^~]+/g);

console.log(matches);
document.write(matches);
</div> </div>

Der Regex [^ ~] + passt alle Zeichen außer ~ an und gibt die Übereinstimmungen in einem Array zurück. Sie können dann die Übereinstimmungen daraus extrahieren.

0
hinzugefügt
hinzugefügt der Autor Andrew Willems, Quelle
Das hat für mich funktioniert! str.split (); funktionierte in Firefox nicht, aber das funktionierte sowohl in Chrome als auch in Firefox.
hinzugefügt der Autor Sandeep, Quelle

Nun, der einfachste Weg wäre etwas wie:

var address = theEncodedString.split(/~/)
var name = address[0], street = address[1]
0
hinzugefügt

Laut ECMAScript6 ES6 zerstört der saubere Weg Arrays:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="true"> <div class="snippet-code">

const input = 'john smith~123 Street~Apt 4~New York~NY~12345';
const [name, street, unit, city, state, zip] = input.split('~');

console.log(name);//john smith
console.log(street);//123 Street
console.log(unit);//Apt 4
console.log(city);//New York
console.log(state);//NY
console.log(zip);//12345
</div> </div>

Sie haben möglicherweise zusätzliche Elemente in der Eingabezeichenfolge. In diesem Fall können Sie den Restoperator verwenden, um ein Array für den Rest zu erhalten oder sie einfach zu ignorieren:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="true"> <div class="snippet-code">

const input = 'john smith~123 Street~Apt 4~New York~NY~12345';
const [name, street, ...others] = input.split('~');

console.log(name);//john smith
console.log(street);//123 Street
console.log(others);//["Apt 4", "New York", "NY", "12345"]
</div> </div>

Ich habe eine schreibgeschützte Referenz für Werte angenommen und die Deklaration const verwendet.

Viel Spaß mit ES6!

0
hinzugefügt
@Sallar Ja. Danke Kumpel!
hinzugefügt der Autor hallaji, Quelle
Sie können auch ein Element überspringen: const [name, unit, ... others] = ...
hinzugefügt der Autor Sallar, Quelle

Auch wenn dies nicht der einfachste Weg ist, könnten Sie dies tun:

var addressString = "~john smith~123 Street~Apt 4~New York~NY~12345~",
    keys = "name address1 address2 city state zipcode".split(" "),
    address = {};

// clean up the string with the first replace
// "abuse" the second replace to map the keys to the matches
addressString.replace(/^~|~$/g).replace(/[^~]+/g, function(match){
    address[ keys.unshift() ] = match;
});

// address will contain the mapped result
address = {
    address1: "123 Street"
    address2: "Apt 4"
    city: "New York"
    name: "john smith"
    state: "NY"
    zipcode: "12345"
}

Aktualisierung für ES2015 mithilfe von Destrukturierung

const [address1, address2, city, name, state, zipcode] = addressString.match(/[^~]+/g);

// The variables defined above now contain the appropriate information:

console.log(address1, address2, city, name, state, zipcode);
// -> john smith 123 Street Apt 4 New York NY 12345
0
hinzugefügt
Können Sie erklären, wie das funktioniert?
hinzugefügt der Autor Glycan, Quelle
Zuerst haben wir eine Zeichenfolge, die durch '~' Zeichen und ein Array von Tasten getrennt ist. Die zweite Replace-Funktion verwendet [^ ~] + , um jedem einzelnen Teil (zB '123 Street', 'Apt 4' usw.) zu entsprechen und ruft die Funktion für jedes Teil auf, wobei es als Argument übergeben wird . Bei jedem Durchlauf übernimmt die Funktion den ersten Schlüssel aus dem Schlüsselarray (entfernt ihn auch mit Array.unshift) und weist den Schlüssel und das Teil dem Adressobjekt zu.
hinzugefügt der Autor ewino, Quelle

Sie brauchen jQuery nicht.

var s = 'john smith~123 Street~Apt 4~New York~NY~12345';
var fields = s.split(/~/);
var name = fields[0];
var street = fields[1];
0
hinzugefügt
Danke, dass du darauf hingewiesen hast, dass split eine Regex akzeptiert!
hinzugefügt der Autor phunehehe, Quelle
Sie brauchen Regex nicht zu dieser einfachen Ersetzung hinzuzufügen. Es wird es nur langsamer machen, wenn überhaupt. Sie können es in Anführungszeichen für eine einfache Zeichenfolge ersetzen ändern.
hinzugefügt der Autor Anish Gupta, Quelle

Mit JavaScript String.prototype.split funktion:

var input = 'john smith~123 Street~Apt 4~New York~NY~12345';

var fields = input.split('~');

var name = fields[0];
var street = fields[1];
// etc.
0
hinzugefügt
@ImaginedDesign Sie irren sich. In JavaScript können Sie einfache Anführungszeichen und doppelte Anführungszeichen synonym verwenden. Der einzige Unterschied besteht darin, welches Zitat in ihnen maskiert werden muss - \ ' oder \ . Das Muster, das Sie in den Antworten der Leute gesehen haben, war nur ein Zufall, die Art des Zitats Verwendung ist persönliche Präferenz.
hinzugefügt der Autor Rory O'Kane, Quelle
Scheint so, als ob JavaScript erfordert, dass der Split einfache Anführungszeichen verwendet und jQuery die Verwendung von Anführungszeichen erfordert. Hoffe das hilft anderen.
hinzugefügt der Autor ImaginedDesign, Quelle
Es ist völlig verrückt, ein Array "Split" zu nennen. Es sieht so aus, als wäre der Name des Arrays eine Funktion. Sehr verwirrend für jemanden mit begrenztem Wissen.
hinzugefügt der Autor gravityboy, Quelle

Etwas wie:

var divided = str.split("/~/");
var name=divided[0];
var street = divided[1];

Wird wahrscheinlich am einfachsten sein

0
hinzugefügt
Nein, Sie möchten entweder split ("~") oder split (/ ~ /) , aber nicht split ("/ ~ /") . Letzteres würde nur "John/~/Smith" und nicht "John ~ Smith" teilen.
hinzugefügt der Autor Andrew Willems, Quelle

Zach had this one right.. using his method you could also make a seemingly "multi-dimensional" array.. I created a quick example at JSFiddle http://jsfiddle.net/LcnvJ/2/

// array[0][0] will produce brian
// array[0][1] will produce james

// array[1][0] will produce kevin
// array[1][1] will produce haley

var array = [];
    array[0] = "brian,james,doug".split(",");
    array[1] = "kevin,haley,steph".split(",");
0
hinzugefügt

Verwenden Sie diesen Code ------

function myFunction() {
var str = "How are you doing today?";
var res = str.split("/");

}
0
hinzugefügt