Как разбить строку по первому совпадению с разделителем?
Имеется:
var str = 'Lorem ipsum dolor sit amet'; // и тд миллион слов console.log(str.split(' ')); // -> [ 'lorem', 'ipsum', 'dolor', 'sit', 'amet' ] Должно быть: var str = 'Lorem ipsum dolor sit amet', firstSpace = /\s/.exec(str).index; console.log(str.метод(firstSpace)); // -> [ 'lorem', 'ipsum dolor sit amet' ] Насколько я понимаю метод split будет перебирать всю строку даже найдя первое совпадение, мне же нужно остановить поиск при первом обнаружении пробела. Как это сделать? |
var str = 'Lorem ipsum dolor sit amet'; console.log(str.split(/\s(.*)/g, 2)); Если нужно по первому символу... var str = 'Lorem ipsum dolor sit amet'; var index = str.indexOf(" "); console.log([str.slice(0, index), str.slice(index + 1)]); |
Malleys,
спасибо. Было бы круто, если бы был аналог TextNode.splitText(offset), но только для строк. ИЗОБРЕТЕНИЕ: метод slash для строк // ВНИМАНИЕ! МЕТОД НЕ СУЩЕСТВУЕТ ! var str = 'Lorem ipsum dolor sit amet'; str.slash(' '); // -> [ 'lorem', 'ipsum dolor sit amet' ] str.slash(' ',2); // -> [ 'lorem ipsum', 'dolor sit amet' ] str.slash(' ',-1); // -> [ 'lorem ipsum dolor sit', 'amet' ] str.slash(8); // -> [ 'lorem ip', 'sum dolor sit amet' ] str.slash(-3); // -> [ 'lorem ipsum dolor sit a', 'met' ] |
:write:
var str = 'Lorem ipsum dolor sit amet'; console.log(/(\S+)\s(.*)/.exec(str).slice(1)); // -> [ 'lorem', 'ipsum dolor sit amet' ] |
рони,
хитро! Если идея вас заинтересовала, попробуйте реализовать метод slash. Знаю, что нужно будет дополнить прототип String. Я тоже займусь на досуге. Спасибо! |
Цитата:
|
рони,
это следствие отсутствия нормального метода разбиения строки на две части. Так сказать идея ) https://javascript.ru/forum/misc/767...tml#post503236 Скоро я выложу реализацию, не стал создавать новую тему ) |
{ class SplittableString extends String { slash(char, offset) { if(arguments.length === 0) return this.slash(""); if(arguments.length === 1) return Number.isFinite(arguments[0]) ? this.slash("", arguments[0]) : this.slash(arguments[0], 1); var matches = Array.from(str.matchAll(char)); offset -= char.length; if(offset < 0) offset += matches.length + char.length + (char === "" ? -1 : 0); var index = matches[offset].index; return [str.slice(0, index), str.slice(index + char.length)]; } }; var str = new SplittableString('Lorem ipsum dolor sit amet'); console.log(str.slash(' ')); // -> [ 'lorem', 'ipsum dolor sit amet' ] console.log(str.slash(' ',2)); // -> [ 'lorem ipsum', 'dolor sit amet' ] console.log(str.slash(' ',-1)); // -> [ 'lorem ipsum dolor sit', 'amet' ] console.log(str.slash(8)); // -> [ 'lorem ip', 'sum dolor sit amet' ] console.log(str.slash(-3)); // -> [ 'lorem ipsum dolor sit a', 'met' ] } |
Malleys,
Класс! А я всё сижу пишу свою реализацию ... Спасибо! |
Всё что смог сделать ) Работает, но я думаю код мудреный:
const oo=console.log; String.prototype.slash=function(a,b=1){ var s=this, l=s.length, i, f=(j=0)=>[s.slice(0,i),s.slice(i+j)]; oo(s,b,a); if(a.length){ // a:string var c=0, m='indexOf', k=1; if(b==1){ i=s[m](a); return i<0?s:f(1) }; if(b<1){ m='lastIndexOf'; b=-b; k=-1 }; while(c!=b){ i=s[m](a,i+k); if(i<0){break}; c++ }; return f(1) }; if(Math.abs(a)>=l){return s}; i=a>0?a:l+a; return f() }; oo('lorem ipsum/dolor sit/amet'.slash('/',-2)); // -> [ 'lorem ipsum', 'dolor sit/amet' ] Буду очень вам признателен за советы по возможному улучшению кода, спасибо! |
Часовой пояс GMT +3, время: 02:44. |