2010-08-06 2 views
3

Учитывая входную строку, я хотел бы получить вывод из этого в указанном формате: filename;path.Обработка строк

Для входной строки /vob/TEST/[email protected]@/main/ch_vobsweb/1/VOBSWeb/main/ch_vobsweb/4/VobsWebUI/main/ch_vobsweb/2/VaultWeb/main/ch_vobsweb/2/func.js

Я ожидал этот выходной строки: func.js;VOBSWeb/VosWebUI/VaultWeb/func.js

Имя файла приведен в конце всей строки, и путь должен быть зачищены с помощью символов после каждого числовое значение (например, /1/VOBSWeb/, а затем /4/VobsWebUI, а затем /2/vaultWeb)

+1

Я думаю, что main/ch_vobsweb распространен после @@, поэтому попробуйте заменить его на string.replace – KoolKabin

+0

@ Daniel: Поговорите сами; кто-то уже написал это для него. Если это заставляет вас чувствовать себя лучше, это было не очень эффективное или поддерживаемое решение. –

+0

@Steven Вы имеете в виду мое решение как неэффективное и не поддерживаемое? –

ответ

0

Javascript имеет функцию сплит() на строки, которая возвращает массив, так что я думаю, что это, вероятно, является хорошей отправной точкой за то, что вы собираетесь.

+0

FYI: У этого вопроса раньше был тег javascript, а не тег C#, прежде чем он был объединен. –

+0

Требуется иметь одинаковый порядок сортировки в Javascript, если возможно – Raj

0

Предполагая, что его не произвольное число путей вы можете использовать регулярные выражения:

Найти это:

.*[0-9]/([a-zA-Z]*)/[^0-9]*[0-9]/([a-zA-Z]*)/[^0-9]*[0-9]/([a-zA-Z]*)/[^0-9]*[0-9]/([a-zA-Z.]*)/ 

Затем используйте группировки, чтобы записать новую строку:

\4;\1/\2/\3/\4 
1

Если количество путей произвольно, то вам нужен двухэтапный подход:


Первый, удалите все «неинтересные вещи» из строки.

Искать .*?/\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 не поддерживает это.