첫 번째 공백 발생시 분할 문자열


150

첫 번째 공백 발생으로 문자열을 나누는 최적화 된 정규 표현식을 얻지 못했습니다.

var str="72 tocirah sneab";

나는 얻을 필요가있다 :

[
    "72",
    "tocirah sneab",
]

1
"최적화"란 무엇을 의미합니까? 그것은 않는 정규식으로?
Deestan

시간을내어 @ georg 's answer-beautiful stackoverflow.com/a/10272828/93910
Sanjay Manohar에서

답변:


324

공백 문자 (탭이나 다른 공백 문자는 아님) 만 고려하고 첫 번째 공백 앞의 모든 문자와 첫 번째 공백 뒤의 모든 문자 만 신경 쓰는 경우 다음과 같이 정규 표현식없이 수행 할 수 있습니다.

str.substr(0,str.indexOf(' ')); // "72"
str.substr(str.indexOf(' ')+1); // "tocirah sneab"

공백이 없으면 첫 번째 줄은 빈 문자열을 반환하고 두 번째 줄은 전체 문자열을 반환합니다. 해당 상황에서 원하는 동작인지 또는 해당 상황이 발생하지 않는지 확인하십시오.


50

자바 스크립트는 lookbehinds를 지원하지 않으므로 split불가능합니다. match공장:

str.match(/^(\S+)\s(.*)/).slice(1)

또 다른 트릭 :

str.replace(/\s+/, '\x01').split('\x01')

어때요?

[str.replace(/\s.*/, ''), str.replace(/\S+\s/, '')]

왜 안돼?

reverse = function (s) { return s.split('').reverse().join('') }
reverse(str).split(/\s(?=\S+$)/).reverse().map(reverse)

아니면

re = /^\S+\s|.*/g;
[].concat.call(re.exec(str), re.exec(str))

2019 업데이트 : ES2018부터 lookbehinds가 지원됩니다.

str = "72 tocirah sneab"
s = str.split(/(?<=^\S+)\s/)
console.log(s)


str.match(/^(\S+)\s(.*)/).slice(1) 공간이없는 줄에서는 작동하지 않습니다
Junaid

30

ES6에서는 다음을 수행 할 수도 있습니다.

let [first, ...second] = str.split(" ")
second = second.join(" ")

2
나는 이것을 아주 좋아하고 잘 작동하지만 성능면에서 가장 현명한 "하위 문자열"솔루션에는 꽤 나쁘다. 방금 테스트했으며 약 10 배 느립니다.
pootzko

19

게임을 늦게 알고는 있지만이 작업을 수행하는 매우 간단한 방법이 있습니다.

const str = "72 tocirah sneab";
const arr = str.split(/ (.*)/);
console.log(arr);

이 떠나 arr[0]"72"arr[1]함께 "tocirah sneab". arr [2]는 비어 있지만 무시해도됩니다.

참고로 :

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split#Capturing_parentheses


마지막 빈 요소가 생성됩니다.
Benjamin Intal

13
var arr = [];             //new storage
str = str.split(' ');     //split by spaces
arr.push(str.shift());    //add the number
arr.push(str.join(' '));  //and the rest of the string

//arr is now:
["72","tocirah sneab"];

그래도 여전히 더 빠른 방법이 있다고 생각합니다.


11

georg의 솔루션은 훌륭하지만 문자열에 공백이 없으면 중단됩니다. 문자열에 공백이없는 경우 .split 및 캡처 그룹을 사용하는 것이 더 안전합니다.

str_1 = str.split(/\s(.+)/)[0];  //everything before the first space
str_2 = str.split(/\s(.+)/)[1];  //everything after the first space

9

.replace를 사용하여 첫 번째 항목 만 교체 할 수 있습니다.

str = str.replace(' ','<br />');

/ g를 그대로 둡니다.

데모


3
@DannyHerran .. 아뇨? 코드를 테스트 했습니까? / g 수정자가 없습니다. 전 세계가 아닙니다. 코드의 기능을 알기 전에 코드를 테스트 해보십시오 . 세 가지 주요 브라우저에서도 테스트되었습니다. 왜 당신이 어떻게 생각하는지 알고 싶습니다.
Daedalus

항상 이것을 결함으로 간주했기 때문에 현명합니다. 이것은 내가 이것을 볼 수있는 첫 번째입니다 :)
Gogol

2

끈을 배열로 나누고 필요한 부분을 붙이십시오. 이 접근 방식은 매우 유연하며 많은 상황에서 작동하며 추론하기 쉽습니다. 또한 하나의 함수 호출 만 필요합니다.

arr = str.split(' ');             // ["72", "tocirah", "sneab"]
strA = arr[0];                    // "72"
strB = arr[1] + ' ' + arr[2];     // "tocirah sneab"

또는 문자열에서 직접 필요한 것을 체리 피킹하려면 다음과 같이 할 수 있습니다.

strA = str.split(' ')[0];                    // "72";
strB = str.slice(strA.length + 1);           // "tocirah sneab"

또는 이렇게 :

strA = str.split(' ')[0];                    // "72";
strB = str.split(' ').splice(1).join(' ');   // "tocirah sneab"

그러나 첫 번째 예를 제안합니다.

실습 데모 : jsbin


이렇게! "죄수"가 있습니까?
iglesiasedd

0

클래스 목록이나 클래스 이름 또는 ID의 일부에서 클래스를 가져와야 할 때마다 항상 split ()을 사용하고 배열 인덱스를 사용하여 클래스를 얻거나 대부분의 경우 pop () 첫 번째 요소를 얻는 마지막 요소 또는 shift ()

이 예는 div의 클래스 "gallery_148 ui-sortable"을 가져와 갤러리 ID 148을 반환합니다.

var galleryClass = $(this).parent().prop("class"); // = gallery_148 ui-sortable
var galleryID = galleryClass.split(" ").shift(); // = gallery_148
galleryID = galleryID.split("_").pop(); // = 148
//or
galleryID = galleryID.substring(8); // = 148 also, but less versatile 

더 적은 줄로 압축 할 수 있다고 확신하지만 읽기 쉽게 확장했습니다.


0

약간 다른 결과가 필요했습니다.

나는 첫 단어를 원했고, 아무 것도 비워도 그 뒤를이었다.

str.substr(0, text.indexOf(' ') == -1 ? text.length : text.indexOf(' '));
str.substr(text.indexOf(' ') == -1 ? text.length : text.indexOf(' ') + 1);

입력이 경우 그래서 oneword당신이 얻을 oneword'' .

입력이 one word and some more있으면 one및 을 얻습니다 word and some more.


0

공간 부족을 처리하면서 한 줄로 모두 할 수있을 때 다른 모든 대답이 왜 그렇게 복잡한 지 잘 모르겠습니다.

예를 들어, 이름의 첫 번째 및 "기타"구성 요소를 가져 오겠습니다.

let [first, last] = 'John Von Doe'.split(/ (.*)/);
console.log({ first, last });

[first, last] = 'Surma'.split(/ (.*)/);
console.log({ first, last });


-1

다음 함수는 문장을 항상 두 요소로 나눕니다. 첫 번째 요소는 첫 번째 단어 만 포함하고 두 번째 요소는 다른 모든 단어를 포함합니다 (또는 빈 문자열 임).

var arr1 = split_on_first_word("72 tocirah sneab");       // Result: ["72", "tocirah sneab"]
var arr2 = split_on_first_word("  72  tocirah sneab  ");  // Result: ["72", "tocirah sneab"]
var arr3 = split_on_first_word("72");                     // Result: ["72", ""]
var arr4 = split_on_first_word("");                       // Result: ["", ""]

function split_on_first_word(str)
{
    str = str.trim();  // Clean string by removing beginning and ending spaces.

    var arr = [];
    var pos = str.indexOf(' ');  // Find position of first space

    if ( pos === -1 ) {
        // No space found
        arr.push(str);                // First word (or empty)
        arr.push('');                 // Empty (no next words)
    } else {
        // Split on first space
        arr.push(str.substr(0,pos));         // First word
        arr.push(str.substr(pos+1).trim());  // Next words
    }

    return arr;
}

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