Если количество путей произвольно, то вам нужен двухэтапный подход:
Первый, удалите все «неинтересные вещи» из строки.
Искать .*?/\d+/([^/]+/?)
и заменить все на $1
.
В C#: resultString = Regex.Replace(subjectString, @".*?/\d+/([^/]+/?)", "$1");
В JavaScript: result = subject.replace(/.*?\/\d+\/([^\/]+\/?)/g, "$1");
Это превратит вашу строку в VOBSWeb/VobsWebUI/VaultWeb/func.js
.
Второй, скопируйте имя файла в начале строки.
Искать (.*/)([^/]+)$
и заменить на $2;$1$2
.
C#: resultString = Regex.Replace(subjectString, "(.*/)([^/]+)$", "$2;$1$2");
JavaScript: result = subject.replace(/(.*\/)([^\/]+)$/g, "$2;$1$2");
Это трансформирует результат предыдущей операции в func.js;VOBSWeb/VobsWebUI/VaultWeb/func.js
Если число путей постоянна, то вы можете сделать это в одно регулярное выражение:
Поиск ^.*?/\d+/([^/]+/).*?/\d+/([^/]+/).*?/\d+/([^/]+/).*?/\d+/([^/]+)
и заменить на $4;$1$2$3$4
.
C#: resultString = Regex.Replace(subjectString, @"^.*?/\d+/([^/]+/).*?/\d+/([^/]+/).*?/\d+/([^/]+/).*?/\d+/([^/]+)", "$4;$1$2$3$4");
JavaScript: result = subject.replace(/^.*?\/\d+\/([^\/]+\/).*?\/\d+\/([^\/]+\/).*?\/\d+\/([^\/]+\/).*?\/\d+\/([^\/]+)/g, "$4;$1$2$3$4");
Это регулярное выражение будет неэффективным, если строка не совпадает; это может быть улучшено с помощью атомной группировки, но JavaScript не поддерживает это.
Я думаю, что main/ch_vobsweb распространен после @@, поэтому попробуйте заменить его на string.replace – KoolKabin
@ Daniel: Поговорите сами; кто-то уже написал это для него. Если это заставляет вас чувствовать себя лучше, это было не очень эффективное или поддерживаемое решение. –
@Steven Вы имеете в виду мое решение как неэффективное и не поддерживаемое? –