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


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.