Bir dizeyi belirli bir karakteri kırarak nasıl bölerim?


533

Bu dizeye sahibim

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

JavaScript kullanarak, bunu ayrıştırmanın en hızlı yolu nedir?

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

Yanıtlar:


846

JavaScript String.prototype.splitişlevi ile:

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

JQuery'ye ihtiyacınız yok.

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
Bu basit değiştirmeye normal ifade eklemenize gerek yoktur. Sadece bir şey varsa yavaşlatacaktır. Basit bir dize değiştirme için tırnak işaretleri olarak değiştirebilirsiniz.
Anish Gupta

47

ECMAScript6'ya göre ES6, temiz yol dizileri yok etmektir:

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

Giriş dizesinde fazladan öğeleriniz olabilir. Bu durumda, geri kalanı için bir dizi almak veya yalnızca yoksaymak için rest işlecini kullanabilirsiniz:

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

Değerler için salt okunur bir referans gerekiyordu ve constbildirimi kullandım .

ES6'nın tadını çıkarın!


6
Ayrıca bir öğeyi atlayabilirsiniz:const [name, , unit, ...others] = ...
Sallar

16

Bu en basit yol olmasa da, bunu yapabilirsiniz:

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

Yıkım kullanarak ES2015 güncellemesi

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
önce '~' işaretleriyle ayrılmış bir dizemiz ve bir dizimiz var keys. İkinci değiştirme işlevi, [^~]+her farklı parçayı (yani '123 Street', 'Apt 4', vb.) Eşleştirmek için kullanılır ve işlevi her parça için argüman olarak ileterek çağırır. Her çalıştırmada, işlev ilk anahtarı keys dizisinden alır (ayrıca Array.unshift kullanarak kaldırma) ve anahtarı ve parçayı adres nesnesine atar.
15:52


5

en kolay yol şudur:

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

5

Eğer Spliter bulunursa o zaman sadece

Böl onu

başka aynı dizeyi döndürür

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

Gibi bir şey:

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

Muhtemelen en kolay olacak


2
Hayır, ya istediğiniz split("~")ya split(/~/)ama split("/~/"). İkincisi sadece bölünür "John/~/Smith"ve olmazdı "John~Smith".
Andrew Willems

4

splitMetni bölmek için kullanabilirsiniz .

Alternatif olarak, matchaşağıdaki gibi de kullanabilirsiniz

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

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

Normal ifade [^~]+, hariç tüm karakterlerle ~eşleşir ve dizideki eşleşmeleri döndürür. Daha sonra eşleşmeleri buradan çıkarabilirsiniz.


1
Bu benim için çalıştı! str.split();Firefox'ta çalışmıyor, ancak bu hem Chrome'da hem de Firefox'ta çalıştı.
Sandeep


2

Zach bu hakkı vardı .. yöntemini kullanarak da görünüşte "çok boyutlu" bir dizi yapabilirsiniz .. JSFiddle hızlı bir örnek oluşturdum 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: Dizeyi Dizi JavaScript Bölmesine Dönüştür

    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

Bu string.split("~")[0];işleri hallediyor.

kaynak: String.prototype.split ()


Köri ve fonksiyon kompozisyonunu kullanan bir başka fonksiyonel yaklaşım.

Yani ilk şey bölünmüş işlev olacaktır. Bunu buna "john smith~123 Street~Apt 4~New York~NY~12345"dönüştürmek istiyoruz["john smith", "123 Street", "Apt 4", "New York", "NY", "12345"]

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

Şimdi özel splitByTildefonksiyonumuzu kullanabiliriz . Misal:

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

İlk elemanı elde etmek için list[0]operatörü kullanabiliriz . Bir firstfonksiyon oluşturalım:

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

Algoritma: iki nokta üst üste tarafından bölünür ve ardından verilen listenin ilk öğesini alır. Böylece son getNamefonksiyonumuzu oluşturmak için bu fonksiyonları oluşturabiliriz . Aşağıdakilerle bir composeişlev oluşturma reduce:

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

Ve şimdi onu oluşturmak splitByTildeve firstişlevleri için kullanmak.

const getName = compose(first, splitByTilde);

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

1

Düz Javascript'te deneyin

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

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

0

Virgülle ilgili bölünme sorusu bu soruya kopyalandığından, bunu buraya ekleyin.

Eğer bir karakterinden bölünür ve aynı zamanda sık sık virgül ile olur karakteri, arkasından gelebilecek ekstra boşluğa işlemek istiyorsanız, kullanabileceğiniz replacesonra splitbu gibi:

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

-1

Bu kodu kullanın -

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

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.