#javascript
#javascript
Вопрос:
Итак, я знаю, как получить подстроку из 2 символов, используя метод index или split. Но я застрял в сценарии с множеством строк с похожими именами, такими как:
"2020-12-09-name_of_this_mission_num1_mission1_fileName_something"
"2020-12-09-name_of_this_mission_num1_mission12_fileName_something"
"2020-12-09-name_of_this_mission_num23_mission1_fileName_something_else"
Например, я застрял на том, как извлечь только часть «mission #», потому что иногда имена могут быть разными, поэтому длина разная, а иногда имена совпадают, совпадают с именем файла. Я также думал об использовании индекса «_», но есть несколько «_», и они могут оказаться в другом индексе, если имя отличается.
Может ли кто-нибудь дать мне какой-нибудь намек на это?
Комментарии:
1. Итак, ваши желаемые результаты
mission1
,mission12
, иmission1
соответственно?2. Да, это то, что я хочу извлечь
Ответ №1:
Если структура строк всегда одинакова — и вам нужен второй экземпляр ‘mision’ — тогда разделите полную строку на текст ‘mission’.
Это даст массив с тремя частями — [«2020-12-09-name_of_this_», «num1«, «1_fileName_something»])
Затем получите последний элемент в этом массиве частей и возьмите число из начала результирующей строки.
Затем вы можете добавить к нему «миссию», которую вы удалили, поместить ее в массив, и у вас будет массив миссий.
Если ваша начальная строка не содержит двух экземпляров ‘mission’, то вы можете настроить ее так, чтобы она возвращала 2-ю, а не 3-ю часть, как я сделал с ‘mission2’.
const missions = [
"2020-12-09-name_of_this_mission_num1_mission1_fileName_something",
"2020-12-09-name_of_this_mission_num1_mission12_fileName_something",
"2020-12-09-name_of_this_mission_num23_mission1_fileName_something_else",
"2020-12-09-name_of_this_mission2_fileName_something_else"
]
let missionsArr = [];
missions.forEach(function(mission) {
const missionPortions = mission.split('mission');
let index;
missionPortions.length == 2
? index = 1
: index = 2
missionsArr.push('mission' parseInt(missionPortions[index]))
})
console.log(missionsArr); //gives ["mission1","mission12", "mission1", "mission2"];
Комментарии:
1. Большое спасибо, все ваши ответы — отличная помощь!!
Ответ №2:
Простая функция сопоставления регулярных выражений. Обратите внимание, что ‘match’ выводит массив, поэтому нажмите match [0]:
const missions = [
"2020-12-09-name_of_this_mission_num1_mission1_fileName_something",
"2020-12-09-name_of_this_mission_num1_mission12_fileName_something",
"2020-12-09-name_of_this_mission_num23_mission1_fileName_something_else"
]
let Arr = [];
missions.forEach(function(mission) {
const missionID = mission.match(/missiond /);
Arr.push(missionID[0]);
})
console.log(Arr);
Комментарии:
1. Я понял это, спасибо за помощь!!
Ответ №3:
Самый простой способ просто получить задание ##, предполагая, что # — это переменное количество цифр, — это использовать регулярное выражение.
Базовым регулярным выражением будет /missiond /
то, которое соответствует строке "mission"
, за которой следует хотя бы одно число.
Предполагая, что у вас есть свой вклад в виде:
const missionsTexts = [
"2020-12-09-name_of_this_mission_num1_mission1_fileName_something",
"2020-12-09-name_of_this_mission_num1_mission12_fileName_something",
"2020-12-09-name_of_this_mission_num23_mission1_fileName_something_else"
];
Вы можете преобразовать их в массив только mission#
с помощью следующего алгоритма:
const missions = missionsTexts.map(missionText => missionText.match(/missiond /g)[0]);
Обратите внимание, что это предполагает, что для каждого missionText есть только mission#
один. g
Модификатор используется, чтобы убедиться, что регулярное выражение не создает совпадения после первой найденной цифры.
Комментарии:
1. О, я думал об индексе первой и последней части, но никогда не думал о том, чтобы сделать что-то с той частью, которую мы хотим. Это здорово, большое спасибо.
2. Нет проблем! Операции с массивами и регулярные выражения обычно являются довольно мощными инструментами