Как получить подстроку между 2 одинаковыми символами в javascript?

#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. Нет проблем! Операции с массивами и регулярные выражения обычно являются довольно мощными инструментами