Comment diviser une chaîne en rompant avec un caractère particulier?


533

J'ai cette chaîne

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

En utilisant JavaScript, quel est le moyen le plus rapide d'analyser cela en

var name = "john smith";
var street= "123 Street";
//etc...

Réponses:


846

Avec la String.prototype.splitfonction JavaScript :

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.

51

Vous n'avez pas besoin de jQuery.

var s = 'john smith~123 Street~Apt 4~New York~NY~12345';
var fields = s.split(/~/);
var name = fields[0];
var street = fields[1];

53
Vous n'avez pas besoin d'ajouter l'expression régulière à ce simple remplacement. Cela ne fera que le ralentir, le cas échéant. Vous pouvez le remplacer par des guillemets pour un simple remplacement de chaîne.
Anish Gupta

47

Selon ECMAScript6 ES6, la voie propre consiste à déstructurer les tableaux:

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

Vous pouvez avoir des éléments supplémentaires dans la chaîne d'entrée. Dans ce cas, vous pouvez utiliser l'opérateur de repos pour obtenir un tableau pour le reste ou simplement les ignorer:

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

J'ai supposé une référence en lecture seule pour les valeurs et j'ai utilisé la constdéclaration.

Profitez d'ES6!


6
Vous pouvez également ignorer un élément:const [name, , unit, ...others] = ...
Sallar

16

Même si ce n'est pas le moyen le plus simple, vous pouvez le faire:

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

Mise à jour pour ES2015, utilisant la déstructuration

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

4
nous avons d'abord une chaîne séparée par des signes «~» et un tableau de keys. La deuxième fonction de remplacement utilise [^~]+pour faire correspondre chaque partie différente (c'est-à-dire «123 Street», «Apt 4», etc.) et appelle la fonction pour chaque partie, en la passant comme argument. À chaque exécution, la fonction prend la première clé du tableau de clés (en la supprimant également à l'aide de Array.unshift) et affecte la clé et la pièce à l'objet d'adresse.
ewino


5

eh bien, le moyen le plus simple serait quelque chose comme:

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

5

Si Spliter est trouvé, alors seulement

Sépare le

sinon retourne la même chaîne

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];
        }
    }
}

4

Quelque chose comme:

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

Va probablement être plus facile


2
Non, vous voulez split("~")ou split(/~/)non split("/~/"). Ce dernier ne ferait que se diviser "John/~/Smith"et non "John~Smith".
Andrew Willems

4

Vous pouvez utiliser splitpour diviser le texte.

Comme alternative, vous pouvez également utiliser matchcomme suit

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

console.log(matches);
document.write(matches);

L'expression régulière [^~]+correspondra à tous les caractères sauf ~et renverra les correspondances dans un tableau. Vous pouvez ensuite en extraire les correspondances.


1
Cela a fonctionné pour moi! str.split();ne fonctionnait pas dans Firefox, mais cela fonctionnait à la fois dans Chrome et Firefox.
Sandeep


2

Zach avait ce droit .. en utilisant sa méthode, vous pouvez également créer un tableau apparemment "multidimensionnel" .. J'ai créé un exemple rapide sur 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(",");

2

JavaScript: Convertir la chaîne en tableau JavaScript Split

    var str = "This-javascript-tutorial-string-split-method-examples-tutsmake."
 
    var result = str.split('-'); 
     
    console.log(result);
     
    document.getElementById("show").innerHTML = result; 
<html>
<head>
<title>How do you split a string, breaking at a particular character in javascript?</title>
</head>
<body>
 
<p id="show"></p> 
 
</body>
</html>

https://www.tutsmake.com/javascript-convert-string-to-array-javascript/


1

Cela string.split("~")[0];fait avancer les choses.

source: String.prototype.split ()


Une autre approche fonctionnelle utilisant la composition de curry et de fonction.

La première chose serait donc la fonction split. Nous voulons faire cela "john smith~123 Street~Apt 4~New York~NY~12345"dans ce["john smith", "123 Street", "Apt 4", "New York", "NY", "12345"]

const split = (separator) => (text) => text.split(separator);
const splitByTilde = split('~');

Alors maintenant, nous pouvons utiliser notre splitByTildefonction spécialisée . Exemple:

splitByTilde("john smith~123 Street~Apt 4~New York~NY~12345") // ["john smith", "123 Street", "Apt 4", "New York", "NY", "12345"]

Pour obtenir le premier élément, nous pouvons utiliser l' list[0]opérateur. Construisons une firstfonction:

const first = (list) => list[0];

L'algorithme est: divisé par les deux points, puis récupère le premier élément de la liste donnée. Nous pouvons donc composer ces fonctions pour construire notre getNamefonction finale . Construire une composefonction avec reduce:

const compose = (...fns) => (value) => fns.reduceRight((acc, fn) => fn(acc), value);

Et maintenant l'utiliser pour composer splitByTildeet firstfonctionner.

const getName = compose(first, splitByTilde);

let string = 'john smith~123 Street~Apt 4~New York~NY~12345';
getName(string); // "john smith"

1

Essayez en Javascript simple

 //basic url=http://localhost:58227/ExternalApproval.html?Status=1

 var ar= [url,statu] = window.location.href.split("=");

0

Étant donné que la question de fractionnement sur virgules est dupliquée sur cette question, ajoutez-la ici.

Si vous souhaitez diviser un caractère et gérer également des espaces supplémentaires qui pourraient suivre ce caractère, ce qui arrive souvent avec des virgules, vous pouvez replacealors utiliser split, comme ceci:

var items = string.replace(/,\s+/, ",").split(',')

-1

Utilisez ce code -

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

}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.