Як я можу розділити рядок лише один раз, тобто зробити 1|Ceci n'est pas une pipe: | Oui
синтаксичний розбір на ["1", "Ceci n'est pas une pipe: | Oui"]
:?
Здається, межа розділення не допомагає ...
Як я можу розділити рядок лише один раз, тобто зробити 1|Ceci n'est pas une pipe: | Oui
синтаксичний розбір на ["1", "Ceci n'est pas une pipe: | Oui"]
:?
Здається, межа розділення не допомагає ...
Відповіді:
Це не дуже гарний підхід, але працює з гідною ефективністю:
var string = "1|Ceci n'est pas une pipe: | Oui";
var components = string.split('|');
alert([components.shift(), components.join('|')]);
components.splice(0,2).slice(0,2)
Ви хочете використовувати, String.indexOf('|')
щоб отримати індекс першого входження '|'.
var i = s.indexOf('|');
var splits = [s.slice(0,i), s.slice(i+1)];
+1
насправді має бути довжина рядка-роздільника, якщо більше одного символу.
var i = s.split('|',2).join('|').length;//2nd index
var splits = [s.slice(0,i).split('|'), s.slice(i+1)];
Ви можете використовувати:
var splits = str.match(/([^|]*)\|(.*)/);
splits.shift();
Регулярний вираз розділяє рядок на дві групи, що збігаються (у дужках), текст перед першою | а текст після. Потім ми shift
отримали результат, щоб позбутися цілого рядкового збігу ( splits[0]
).
Синтаксис 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]
Pas de pipe? C'est null!
Я додав цю відповідь насамперед, щоб міг скласти каламбур на символі труби, а також показати синтаксис es6 - дивно, як багато людей його досі не використовують ...
Спробуйте це:
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", '|');
Якщо рядок не містить роздільника, рішення 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"]
Альтернативний, короткий підхід, крім товарних в інших місцях, полягає у використанні replace()
обмеження на вашу користь.
var str = "1|Ceci n'est pas une pipe: | Oui";
str.replace("|", "aUniquePhraseToSaySplitMe").split("aUniquePhraseToSaySplitMe");
Як зазначає @sreservoir у коментарях, унікальна фраза повинна бути по-справжньому унікальною - вона не може бути у джерелі, на яке ви запускаєте цей розкол, або ви отримаєте рядок, розділений на більше частин, ніж хочете. Недрукований символ, як він каже, може зробити, якщо ви запускаєте це проти вводу користувача (тобто, введеного в браузері).
Це трохи довше, але це працює так, як я вважаю, обмеження повинно:
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 Zero повертає кумедні результати, але в ім'я ефективності я залишив перевірку на це. Ви можете додати це як перший рядок функції, якщо вам це потрібно:
if(limit < 1) return [];
якщо ви хочете використовувати "трубопровід", 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 != ''))
Більш ефективний метод:
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);
використовуйте функціональність регулярного виразу javascript і візьміть перший захоплений вираз.
RE, мабуть, виглядав би так /^([^|]*)\|/
.
насправді, це потрібно лише в тому /[^|]*/
випадку, якщо ви підтвердили, що рядок відформатований таким чином, через жадібність регулярних виразів JavaScript.