Perhaps you want is this: /(?<=https?:\/\/.*)((?:\/[\w]+)*)((?:\/tag)(?:\/[\w%?=.-]+){2,})$/
EDIT
As I was made aware in the comments below of the extra ones that need matching:
/(?<=https?:\/\/.*|[\w_.]+)(?:((?:\/[\w]+)+)((?:\/tag)(?:\/[\w%?=.-]+))|((?:\/[\w]+))*((?:\/tag)(?:\/[\w%?=.-]+){2,}))$/
An example usage in JS:
let regex = /(?<=https?:\/\/.*|[\w_.]+)(?:((?:\/[\w]+)+)((?:\/tag)(?:\/[\w%?=.-]+))|((?:\/[\w]+))*((?:\/tag)(?:\/[\w%?=.-]+){2,}))$/,
examples = ["http://example.com/cat1/subcat3/subcat4/tag/this%20is%20page/asdasda?start=130/asdasdasd", // #Should Match
"http://example.com/cat1/subcat3/subcat4/tag/this%20is%20pageasdasd", // Should Match
"example.it/news/tag/this%is%20n%page?adsadsadasd", // Should Match
"http://example.com/tag/thispage/asdasdasd.-?asds=", // Should Match
"http://example.com/tag/this%20is%20page/asdasd", // Should Match
"http://example.com/tag/this", // Should Not Match
"/tag/this/asdads" // Should Not Match
]
examples.forEach((example) => {
if (example.match(regex)) {
let matches = regex.exec(example),
category = matches[1] !== undefined ? matches[1] : matches[3] !== undefined ? matches[3] : "No category",
tag = matches[2] === undefined ? matches[4] : matches[2];
console.log(`Full String: "${example}"\nCategory: "${category}"\nTag: "${tag}"`)
}
})
See it on Regex101