Попытка разделить строки с известным начальным сегментом и необязательными дополнительными сегментами до общей конечной точки.

eg.

https://example.com/folder/upload/v1/subfolder/asset.doc

https://example.com/folder/upload/temp_cache_folder_id/v1/subfolder/asset.doc

В основном нужно удалить что-либо между / upload / и / v1 /

В настоящее время дошли до

string.split(/.*?(?=v1)/)

Не уверен, как продолжить, оглядываясь назад, пока / не загрузит / и не вернется

[https://example.com/folder , v1/subfolder/asset.doc]

Upload / temp_cache_folder_id позже присоединяется к определенным переменным env, поэтому в нем нет необходимости. Именно поэтому раскол был сделан в первую очередь.

2
Chris 28 Янв 2021 в 01:26

2 ответа

Лучший ответ

Использовать

/^(.*?)\/upload\/.*?(v1.*)/

См. доказательство регулярного выражения.

Объяснение

--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    .*?                      any character except \n (0 or more times
                             (matching the least amount possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  \/                       '/'
--------------------------------------------------------------------------------
  upload                   'upload'
--------------------------------------------------------------------------------
  \/                       '/'
--------------------------------------------------------------------------------
  .*?                      any character except \n (0 or more times
                           (matching the least amount possible))
--------------------------------------------------------------------------------
  (                        group and capture to \2:
--------------------------------------------------------------------------------
    v1                       'v1'
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
  )                        end of \2

Код JavaScript :

const string = "https://example.com/folder/upload/v1/subfolder/asset.doc";
const [_, url, v1] = /^(.*?)\/upload\/.*?(v1.*)/.exec(string);
console.log("URL: " + url);
console.log("v1: " + v1);
1
Ryszard Czech 27 Янв 2021 в 22:32

Используя разделение, вы можете сопоставить /upload/, за которым следует, по крайней мере, возможные символы, пока для утверждения v1 справа не будет.

\/upload\/.*?\b(?=v1)

См. демонстрацию регулярных выражений.

Объяснение

  • \/upload\/ Соответствие /upload/
  • .*? Соответствует 0+ вхождений любого символа, кроме новой строки, по крайней мере
  • \b(?=v1) Граница слова, за которой следует утверждение положительного просмотра вперед v1 справа.
[
  "https://example.com/folder/upload/v1/subfolder/asset.doc",
  "https://example.com/folder/upload/temp_cache_folder_id/v1/subfolder/asset.doc"
].forEach(s => console.log(s.split(/\/upload\/.*?\b(?=v1)/)));
0
The fourth bird 27 Янв 2021 в 22:54
65928345