[javascript] 자바 스크립트에서 문자열을 여러 구분 기호로 어떻게 분할합니까?

JavaScript에서 문자열을 여러 구분 기호로 분리하려면 어떻게합니까? 쉼표와 공백으로 분할하려고하지만 JS의 분할 기능은 하나의 구분 기호 만 지원합니다.



답변

정규 표현식을 매개 변수로 전달하십시오.

js> "Hello awesome, world!".split(/[\s,]+/)
Hello,awesome,world!

추가하기 위해 편집 :

배열의 길이에서 1을 뺀 값을 선택하면 마지막 요소를 얻을 수 있습니다.

>>> bits = "Hello awesome, world!".split(/[\s,]+/)
["Hello", "awesome", "world!"]
>>> bit = bits[bits.length - 1]
"world!"

… 패턴이 일치하지 않는 경우 :

>>> bits = "Hello awesome, world!".split(/foo/)
["Hello awesome, world!"]
>>> bits[bits.length - 1]
"Hello awesome, world!"


답변

정규식을 Javascript의 split 연산자 로 전달할 수 있습니다 . 예를 들면 다음과 같습니다.

"1,2 3".split(/,| /)
["1", "2", "3"]

또는 여러 구분 기호를 함께 사용하여 하나의 역할 만하도록하려면

"1, 2, , 3".split(/(?:,| )+/)
["1", "2", "3"]

(그렇지 않으면 캡처되지 않는 (? 🙂 구문을 사용해야합니다. 그렇지 않으면 결과에 다시 연결되기 때문입니다. 또는 Aaron처럼 영리하고 문자 클래스를 사용할 수 있습니다.)

(Safari + FF에서 테스트 한 예)


답변

간단하지만 효과적인 또 다른 방법은 split + join을 반복적으로 사용하는 것입니다.

"a=b,c:d".split('=').join(',').split(':').join(',').split(',')

본질적으로 split 다음에 join을 수행하는 것은 전역 바꾸기와 비슷하므로 각 구분 기호를 쉼표로 바꾼 다음 모두 바꾸면 쉼표에서 마지막으로 분할됩니다

위 식의 결과는 다음과 같습니다.

['a', 'b', 'c', 'd']

이것을 확장하면 함수에 배치 할 수도 있습니다.

function splitMulti(str, tokens){
        var tempChar = tokens[0]; // We can use the first token as a temporary join character
        for(var i = 1; i < tokens.length; i++){
            str = str.split(tokens[i]).join(tempChar);
        }
        str = str.split(tempChar);
        return str;
}

용법:

splitMulti('a=b,c:d', ['=', ',', ':']) // ["a", "b", "c", "d"]

이 기능을 많이 사용하면 String.prototype.split편의를 위해 줄 바꿈 을 고려해 볼 가치가 있습니다 (내 기능이 상당히 안전하다고 생각합니다-유일한 고려 사항은 조건부 (사소한)의 추가 오버 헤드와 한계 인수의 구현이 없다는 사실입니다 배열이 전달되면).

splitMulti아래 에이 접근법을 사용하여 단순히 감싸는 경우 함수 를 포함시켜야합니다 . :). 또한 일부 사람들은 내장 기능을 확장하는 것에 싫증이 나기 때문에 (많은 사람들이 잘못하고 갈등이 발생할 수 있음) 의심 스러우면 이것을 사용하기 전에 더 고위 사람과 이야기하거나 SO에게 물어보십시오.)

    var splitOrig = String.prototype.split; // Maintain a reference to inbuilt fn
    String.prototype.split = function (){
        if(arguments[0].length > 0){
            if(Object.prototype.toString.call(arguments[0]) == "[object Array]" ) { // Check if our separator is an array
                return splitMulti(this, arguments[0]);  // Call splitMulti
            }
        }
        return splitOrig.apply(this, arguments); // Call original split maintaining context
    };

용법:

var a = "a=b,c:d";
    a.split(['=', ',', ':']); // ["a", "b", "c", "d"]

// Test to check that the built-in split still works (although our wrapper wouldn't work if it didn't as it depends on it :P)
        a.split('='); // ["a", "b,c:d"] 

즐겨!


답변

간단하게 유지할 수 있습니다. (RegEx에 “[] +”추가는 “1 이상”을 의미합니다.)

이는 “+”와 “{1,}”이 동일 함을 의미합니다.

var words = text.split(/[ .:;?!~,`"&|()<>{}\[\]\r\n/\\]+/); // note ' and - are kept


답변

까다로운 방법 :

var s = "dasdnk asd, (naks) :d skldma";
var a = s.replace('(',' ').replace(')',' ').replace(',',' ').split(' ');
console.log(a);//["dasdnk", "asd", "naks", ":d", "skldma"]


답변

분할 기능에서 더 많은 사용자 정의를 원하는 사람들을 위해 주어진 문자열을 분할 할 문자 목록으로 분할하는 재귀 알고리즘을 작성했습니다. 위의 게시물을보기 전에 이것을 썼습니다. 좌절 한 프로그래머에게 도움이되기를 바랍니다.

splitString = function(string, splitters) {
    var list = [string];
    for(var i=0, len=splitters.length; i<len; i++) {
        traverseList(list, splitters[i], 0);
    }
    return flatten(list);
}

traverseList = function(list, splitter, index) {
    if(list[index]) {
        if((list.constructor !== String) && (list[index].constructor === String))
            (list[index] != list[index].split(splitter)) ? list[index] = list[index].split(splitter) : null;
        (list[index].constructor === Array) ? traverseList(list[index], splitter, 0) : null;
        (list.constructor === Array) ? traverseList(list, splitter, index+1) : null;
    }
}

flatten = function(arr) {
    return arr.reduce(function(acc, val) {
        return acc.concat(val.constructor === Array ? flatten(val) : val);
    },[]);
}

var stringToSplit = "people and_other/things";
var splitList = [" ", "_", "/"];
splitString(stringToSplit, splitList);

위의 예는 다음을 반환합니다. ["people", "and", "other", "things"]

참고 : flatten기능은 Rosetta Code 에서 가져 왔습니다.


답변

분리 자로 사용하려는 모든 문자를 단수 또는 집합 적으로 정규식으로 묶어 split 함수에 전달할 수 있습니다. 예를 들어 다음과 같이 쓸 수 있습니다.

console.log( "dasdnk asd, (naks) :d skldma".split(/[ \(,\)]+/) );

출력은 다음과 같습니다.

["dasdnk", "asd", "naks", ":d", "skldma"]