У меня есть строка, состоящая из разных элементов, и мне нужно разделить их по другому тегу в строке.
Я использовал .split() и .pop(), которые отлично работали, если есть только один элемент.
function getText(fullText, type) {
var partial = fullText.split('*' + type + '*').pop().split('*/' + type + '*')[0] || 'unknown';
return partial;
}
var str = "*a*Substring A*/a**b*Substring B*/b**c*Substring C*/c*"
getText(str, a) // returns 'Substring A'
Однако теперь я столкнулся с несколькими элементами, и в этом случае он возвращает только последний элемент.
var str = "*a*Substring A*/a**b*Substring B1*/b**b*Substring B2*/b*"
getText(str, b) // returns 'Substring B2'
Как мне получить массив со всеми подстроками между этими тегами?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать shift() для удаления первого элемента, а затем использовать map()
function getText(fullText, type) {
var partial = fullText.split('*' + type + '*')
partial.shift();
for(let i = 0;i<partial.length;i++){
partial[i] = partial[i].split('*/' + type + '*')[0]
}
return partial
}
var str = "*a*Substring A*/a**b*Substring B1*/b**b*Substring B2*/b*"
console.info(getText(str, 'b'))@GabrielRodaEugenBach Поддерживает ли он forEach()?
@GabrielRodaEugenBach Я заменил map() на цикл for. Обязательно проверьте это.
function getText(fullText, type) {
let re = `\\*${type}\\*(.*?)\\*/${type}\\*`;
return fullText
.match(new RegExp(re, 'g'))
.map(str => str.match(new RegExp(re))[1]);
}
var str = "*a*Substring A*/a* woah *a*Substring A 2*/a*"
x = getText(str, 'a')
console.info(x)RegExp хорош для этого решения +1.
это элегантное решение, но, если быть точным, я использую jsx с indesign, и похоже, что он не поддерживает карту es6s, поскольку возвращает «Строка ошибки: > не имеет значения», могу ли я сделать это по-другому?
map — это просто синтаксический сахар для традиционного цикла for. Вы можете заменить его таким. например for (let i = 0; i < fullText.length; i++) fullText[i] = str.match(...);Причина, по которой вы получаете последний элемент, заключается в том, что вы используете pop(), который просто возвращает последний элемент в массиве:
The pop() method removes the last element from an array and returns that element. This method changes the length of the array.
Подробнее об этом можно прочитать на сайте здесь.
Вот один из способов сделать это.
function getText(fullText, type) {
var typeStr = "\*" + type + "\*";
return fullText
.split('/')
.filter(item=>item.match(typeStr.replace(/\*/g, '\\*')))
.map(item=>item
.substr(item.indexOf(typeStr) + typeStr.length)
.replace(/\*$/, ''));
}
var str = "*a*Substring A*/a**b*Substring B*/b**c*Substring C*/c*"
console.info(getText(str, 'a')); // returns 'Substring A'
var str = "*a*Substring A*/a**b*Substring B1*/b**b*Substring B2*/b*"
console.info(getText(str, 'b')); // returns 'Substring B2'Объясняя:
// this creates a str with the type to be searched
var typeStr = "\*" + type + "\*";
return fullText
// this splits all elements in your string
.split('/')
// this leaves only elements that match type...
.filter(item=>item.match(
// using a regex created with the typeStr created above
// replace escape the * char to make regex work
typeStr.replace(/\*/g, '\\*')))
// now with the remaining parts, alter them as follows...
.map(item=>item
// remove everything before type and type itself
.substr(item.indexOf(typeStr) + typeStr.length)
// remove last * char
.replace(/\*$/, ''));
РЕДАКТИРОВАТЬ
Читая ответ @junvar, я заметил закономерность, которую не заметил, когда отвечал. Что если вы замените * на < или > у вас есть шаблон XML. Так что мне кажется, что OP заменил < и > на *, чтобы замаскировать это синтаксический анализ XML. Если это анализ XML, прочитайте самый известный ответ в SO:
https://stackoverflow.com/a/1732454/2752520
ПРОСТО НЕ ИСПОЛЬЗУЙТЕ XML С ПОМОЩЬЮ REGEX.
Использование pop() возвращает последний элемент в массиве (массив, созданный при первом разделении)
пытаться:
function getText(fullText, type) {
var partial = fullText.split('*' + type + '*');
var result = [];
$.each(partial, function(i, item) {
var split = item.split('*/' + type + '*');
if (split.length > 1) {
result.push(split[0]);
}
});
return result;
}
var str = "*a*Substring A*/a**b*Substring B1*/b**b*Substring B2*/b*";
console.info(getText(str, 'b'));
это тоже выглядит аккуратно, но, как я уже упоминал в другом комментарии, я использую jsx с indesign, чтобы быть точным, и похоже, что он не поддерживает карту es6s, поскольку возвращает «Строка ошибки: > не имеет значения», могу ли я сделать это по-другому?