자바 스크립트에서 문자열을 한 번 분할 하시겠습니까?


82

어떻게 한 번만 즉, 메이크업의 문자열을 분할 할 수 있습니다 1|Ceci n'est pas une pipe: | Oui에 구문 분석을 : ["1", "Ceci n'est pas une pipe: | Oui"]?

분할의 한계가 도움이되지 않는 것 같습니다 ...

답변:


79

이것은 예쁜 접근 방식은 아니지만 적절한 효율성으로 작동합니다.

var string = "1|Ceci n'est pas une pipe: | Oui";
var components = string.split('|');
alert([components.shift(), components.join('|')]​);​​​​​

여기에 대한 간단한 데모가 있습니다.


이것은 실제로 정규식보다 낫다고 생각합니다. 올바른 것으로 선택되었습니다. 감사합니다!
— Stavros Korokithakis

2
명확히하기 위해 그는 N 부분으로 분할 한 다음 첫 번째 부분을 목록에 표시하고 나머지 부분을 동일한 목록에 결합합니다.
— Stavros Korokithakis

1이 아닌 k 개의 토큰을 문자열에서 가져 오려면 components.shift () 대신 components.splice (0, k)를 사용하는 것을 제외하고는 위와 동일하게 수행하십시오.
— D Coetzee

2 개 이상의 척으로이 작업을 수행하는 방법을 궁금해하는 사람들을 위해 루프에서 shift를 사용하거나 다음을 사용할 수 있습니다.components.splice(0,2).slice(0,2)
— Ultimater

114

String.indexOf('|')'|'가 처음 나타나는 색인을 가져 오는 데 사용하고 싶을 것 입니다.

var i = s.indexOf('|');
var splits = [s.slice(0,i), s.slice(i+1)];

18
Nick처럼 "재미 있지"는 않지만 아마도 더 효율적일 것입니다. 또한 +1두 개 이상의 문자 인 경우 실제로 구분자 문자열의 길이 여야합니다.
— devios1 2012

이 솔루션이 "재미 있지"않은 이유는 무엇입니까?
— Bentley4 2014 년

궁금한 사람들을 위해 2 개 이상의 청크로이를 수행하려면 루프에서 indexOf를 사용하거나 다음을 사용할 수 있습니다.var i = s.split('|',2).join('|').length;//2nd index var splits = [s.slice(0,i).split('|'), s.slice(i+1)];
— Ultimater

6
IndexOf가 -1을 반환 할 때 split처럼 작동하지 않습니다 (예 : var s = 'string'이면 [ 'strin', 'string']을 반환합니다). 조건문을 작성해야합니다.
— JJJ

14

당신이 사용할 수있는:

var splits = str.match(/([^|]*)\|(.*)/);
splits.shift();

정규식은 문자열을 두 개의 일치하는 그룹 (괄호로 묶음)으로 분할하고 첫 번째 | 그리고 뒤에 텍스트. 그런 다음 shift전체 문자열 일치 ( splits[0])를 제거하는 결과 입니다.


1
적절하게, 그것은 아마도 처음에 고정 될 것입니다. 그러나 javascript regexen은 욕심 많은 것 같습니다.
— muhmuhten

6

하나의 라이너와 imo, 더 간단 :

var str = 'I | am super | cool | yea!';
str.split('|').slice(1).join('|');

이것은 "am super | cool | yea!"를 반환합니다.


4
이것은 요청 된 것이 아니라 누락 된 첫 번째 부분도 찾고 있습니다.
— SmujMaiku 2011

6

ES6 구문은 다른 접근 방식을 허용합니다.

function splitOnce(s, on) {
   [first, ...rest] = s.split(on)
   return [first, rest.length > 0? rest.join(on) : null]
}

또한 |빈 문자열이 아닌 null을 반환 하여 문자열이없는 결과를 처리합니다 .

splitOnce("1|Ceci n'est pas une pipe: | Oui", "|")
>>> ["1", "Ceci n'est pas une pipe: | Oui"]

splitOnce("Celui-ci n'a pas de pipe symbol!", "|")
>>> ["Celui-ci n'a pas de pipe symbol!", null]

파 드 파이프? C'est null!

나는 주로 파이프 기호에 말장난을 할 수 있도록이 답장을 추가했지만, es6 구문을 보여주기 위해-얼마나 ​​많은 사람들이 여전히 그것을 사용하지 않는지 놀랍습니다.


3

이 시도:

function splitOnce(input, splitBy) {
    var fullSplit = input.split(splitBy);
    var retVal = [];
    retVal.push( fullSplit.shift() );
    retVal.push( fullSplit.join( splitBy ) );
    return retVal;
}

var whatever = splitOnce("1|Ceci n'est pas une pipe: | Oui", '|');

3

문자열에 구분 기호가 포함되지 않은 경우 @NickCraver의 솔루션은 여전히 ​​두 요소의 배열을 반환하고 두 번째 요소는 빈 문자열입니다. 나는 분할과 일치하는 행동을 선호합니다. 즉, 입력 문자열에 구분 기호가 포함되어 있지 않으면 단일 요소가있는 배열 만 반환됩니다.

var splitOnce = function(str, delim) {
    var components = str.split(delim);
    var result = [components.shift()];
    if(components.length) {
        result.push(components.join(delim));
    }
    return result;
};

splitOnce("a b c d", " "); // ["a", "b c d"]
splitOnce("a", " "); // ["a"]

1

지금까지 대부분의 답변만큼이나 악합니다.

var splits = str.split('|');
splits.splice(1, splits.length - 1, splits.slice(1).join('|'));

0

다른 곳의 상품 외에 다른 짧은 접근 방식은 replace()의 한계를 활용하는 것입니다.

var str = "1|Ceci n'est pas une pipe: | Oui";
str.replace("|", "aUniquePhraseToSaySplitMe").split("aUniquePhraseToSaySplitMe");

@sreservoir가 주석에서 지적했듯이, 고유 한 문구는 진정으로 고유해야합니다. 그가 말했듯이 인쇄 할 수없는 문자는 사용자 입력 (예 : 브라우저에서 입력)에 대해 이것을 실행하는 경우 가능합니다.


'고유 한'문구를 입력 할 수없는 경우에만 작동합니다. 텍스트 파일에서 읽는 경우 불가능합니다. 브라우저에서 읽는 경우 인쇄 할 수없는 제어 문자 (아마 괜찮은 경우). 탭도 경이로움을 작동합니다. 어쨌든 "aUniquePhraseToSaySplitMe"는 거의 확실하게 입력의 일부이므로 위험합니다.
— muhmuhten

물론 맞습니다. 제 예는 무엇을하고 있는지를 간결하게 설명하기위한 예일뿐입니다. 귀하의 요점을 답변 자체에 통합하겠습니다. 감사!

고유 한 문구에 str을 사용하면 다시는 거기에있을 수 없다는 것을 알 수 있습니다! : 악마의 미소
— 파비오 Beltramini

0

이것은 조금 더 길지만 한계가 다음과 같아야한다고 생각하는 것처럼 작동합니다.

function split_limit(inString, separator, limit){
    var ary = inString.split(separator);
    var aryOut = ary.slice(0, limit - 1);
    if(ary[limit - 1]){
        aryOut.push(ary.slice(limit - 1).join(separator));
    }
    return aryOut;
}
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 1));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 2));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 3));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 7));

https://jsfiddle.net/2gyxuo2j/

limit of Zero는 재미있는 결과를 반환하지만 효율성이라는 이름으로 확인을 생략했습니다. 필요한 경우 다음을 함수의 첫 번째 줄로 추가 할 수 있습니다.

if(limit < 1) return [];

0

"파이프 라인"을 사용하고 싶다면, reduce당신의 친구입니다

const separator = '|'
jsonNode.split(separator)
   .reduce((previous, current, index) =>
    {
        if (index < 2) previous.push(current)
        else previous[1] += `${separator}${current}`
        return previous
    }, [])
    .map((item: string) => (item.trim()))
    .filter((item: string) => (item != ''))

0

더 효과적인 방법 :

const str = "1|Ceci n'est pas une pipe: | Oui"

const [head] = str.split('|', 1);

const result = [head, str.substr(head.length + 1)]

console.log(result);


-1

자바 스크립트 정규 표현식 기능을 사용하고 캡처 된 첫 번째 표현식을 가져옵니다.

RE는 아마처럼 보일 것 /^([^|]*)\|/입니다.

실제로 /[^|]*/자바 스크립트 정규식 욕심으로 인해 문자열이 이러한 방식으로 형식화되었는지 확인한 경우 에만 필요 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.