Làm cách nào để tôi có thể tách một chuỗi chỉ một lần, tức là thực hiện 1|Ceci n'est pas une pipe: | Oui
phân tích cú pháp thành:["1", "Ceci n'est pas une pipe: | Oui"]
:?
Giới hạn phân chia dường như không giúp ích được gì ...
Làm cách nào để tôi có thể tách một chuỗi chỉ một lần, tức là thực hiện 1|Ceci n'est pas une pipe: | Oui
phân tích cú pháp thành:["1", "Ceci n'est pas une pipe: | Oui"]
:?
Giới hạn phân chia dường như không giúp ích được gì ...
Câu trả lời:
Đây không phải là một cách tiếp cận đẹp, nhưng hoạt động với hiệu quả khá:
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)
Bạn muốn sử dụng String.indexOf('|')
để lấy chỉ mục của lần xuất hiện đầu tiên của '|'.
var i = s.indexOf('|');
var splits = [s.slice(0,i), s.slice(i+1)];
+1
thực sự phải là độ dài của chuỗi phân tách, nếu có nhiều hơn một ký tự.
var i = s.split('|',2).join('|').length;//2nd index
var splits = [s.slice(0,i).split('|'), s.slice(i+1)];
Bạn có thể dùng:
var splits = str.match(/([^|]*)\|(.*)/);
splits.shift();
Regex chia chuỗi thành hai nhóm phù hợp (được đặt trong ngoặc đơn), văn bản đứng trước | và văn bản sau. Sau đó, chúng tôi shift
kết quả để loại bỏ toàn bộ chuỗi khớp ( splits[0]
).
Cú pháp ES6 cho phép một cách tiếp cận khác:
function splitOnce(s, on) {
[first, ...rest] = s.split(on)
return [first, rest.length > 0? rest.join(on) : null]
}
Điều này cũng xử lý trường hợp chuỗi không có a |
bằng cách trả về null thay vì chuỗi rỗng, điều này rõ ràng hơn.
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 tẩu? C'est null!
Tôi đã thêm câu trả lời này chủ yếu để tôi có thể chơi chữ ký hiệu ống dẫn, nhưng cũng để thể hiện cú pháp es6 - thật tuyệt vời khi nhiều người vẫn không sử dụng nó ...
Thử đi:
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", '|');
Nếu chuỗi không chứa dấu phân tách @ thì giải pháp của NickCraver sẽ vẫn trả về một mảng gồm hai phần tử, phần tử thứ hai là một chuỗi trống. Tôi thích hành vi phù hợp với hành vi chia tách. Nghĩa là, nếu chuỗi đầu vào không chứa dấu phân cách thì chỉ trả về một mảng với một phần tử duy nhất.
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"]
Một cách tiếp cận ngắn, thay thế, bên cạnh những hàng hóa ở nơi khác, là sử dụng replace()
giới hạn để có lợi cho bạn.
var str = "1|Ceci n'est pas une pipe: | Oui";
str.replace("|", "aUniquePhraseToSaySplitMe").split("aUniquePhraseToSaySplitMe");
Như @sreservoir đã chỉ ra trong các nhận xét, cụm từ duy nhất phải thực sự độc đáo - nó không thể nằm trong nguồn mà bạn đang chạy phần tách này, hoặc bạn sẽ nhận được chuỗi bị chia thành nhiều phần hơn bạn muốn. Một ký tự không thể in được, như anh ấy nói, có thể xảy ra nếu bạn đang chạy điều này dựa trên đầu vào của người dùng (tức là được nhập trong trình duyệt).
Điều này dài hơn một chút, nhưng nó hoạt động như tôi tin rằng giới hạn nên:
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/
giới hạn của Zero trả về kết quả hài hước, nhưng vì hiệu quả, tôi đã bỏ qua việc kiểm tra nó. Bạn có thể thêm điều này làm dòng đầu tiên của hàm nếu bạn cần:
if(limit < 1) return [];
nếu bạn muốn sử dụng "đường ống", reduce
bạn của bạn
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 != ''))
Phương pháp hiệu quả hơn:
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);