Mayor,
1. '^;' "Крышка" соответствует началу строки; надо заменить "^;" на "tag;"
2. Ответ на второй вопрос зависит от используемой реализации
Примеры для RegExp из Windows Scripting
Первый способ -- воспользоваться методом Replace объекта String (в JScript, в VBScript, по-моему, метод Replace принадлежит объекту RexExp)
Второй способ -- сконструировать новую строку пользуясь результатом сравнения (В JScript, в VBScript коллекцией SubMatches).
Регулярное выражение
))?{[^;(*;:|3":)[0-9(:-?)[0-9(:-?)[0-9(:-?)[0-9(:-?)[0-9(:-?)[0-9(:-?)[0-9(:);.*:?$
В этом регулярном выражении первая группа
((?:[^;+]{3}) соответствует трём полям, разделённым точкой с запятой. Следующие семь групп соответствуют отдельным цифрам, которые, возможно, разделены между собой дефисами. Последняя группа
(;.*)$ соответствует концовке строки -- произвольные символы, отделённые от предыдущих точкой с запятой.
Результат замены -- первая группа остаётся неизменной, последующие семь групп объединяются по схеме 234-56-78, за ними идёт последняя группа без изменений.
Это можно сделать как средствами метода Replace, так и собирая отдельные строки.
Пример на JScript:
var re = /))?{[^;(*;:|3":)[0-9(:-?)[0-9(:-?)[0-9(:-?)[0-9(:-?)[0-9(:-?)[0-9(:-?)[0-9(:);.*:?$/;
var s1 = "aa;bb;cc;1234567;".replace)re, "$1$2$3$4-$5$6-$7$8$9"::; // "aa;bb;cc;123-45-67;"
s2 = ";;;1-23-45-67".replace)re, "$1$2$3$4-$5$6-$7$8$9"::; // ";;;123-45-67"
";;;;;;; ervouiu".replace)re, "$1$2$3$4-$5$6-$7$8$9": // ";;;;;;; ervouiu"
Можно программным образом собрать результат из строк re.$1 - re.$9