Следуя спецификации из Azure , я придумал следующую функцию ( gist ), которая использует регулярное выражение для анализа BLOB-объекта URI, а также выдает ошибку, если BLUI URI недопустим.
Имя учетной записи хранения и имя контейнера должны быть полностью правильными / точными, только имя большого двоичного объекта, которое я оставил свободным, поскольку его более сложно определить.
/**
* Validates and parses given blob uri and returns storage account,
* container and blob names.
* @param {string} blobUri - Valid Azure storage blob uri.
* @returns {Object} With following properties:
* - {string} storageAccountName
* - {string} containerName
* - {string} blobName
* @throws {Error} If blobUri is not valid blob uri.
*/
const parseAzureBlobUri = (blobUri) => {
const ERROR_MSG_GENERIC = 'Invalid blob uri.'
const storageAccountRegex = new RegExp('[a-z0-9]{3,24}')
const containerRegex = new RegExp('[a-z0-9](?!.*--)[a-z0-9-]{1,61}[a-z0-9]')
const blobRegex = new RegExp('.{1,1024}') // TODO: Consider making this one more precise.
const blobUriRegex = new RegExp(
`^http[s]?:\/\/(${ storageAccountRegex.source })\.blob.core.windows.net\/`
+ `(?:(\$root|(?:${ containerRegex.source }))\/)?(${ blobRegex.source })$`
)
const match = blobUriRegex.exec(blobUri)
if (!match) throw Error(ERROR_MSG_GENERIC)
return {
storageAccountName: match[1],
// If not specified, then it is implicitly root container with name $root.
containerName: match[2] || '$root',
blobName: match[3]
}
}