Вы хотите найти URL-адрес, утверждать, что URL-адрес в настоящее время НЕ содержит/MyPathSegment /, и заменить его тем же свойством (href или src) и одним и тем же конечным URL-адресом, но посередине, положить отрезок пути:
(?<tag>(?:href|src)=")(?(?=/MyPathSegment/)(?!)|/?(?<url>[^"]*"))
Заменить:
${tag}/MyPathSegment/${url}
В VB.Net:
Dim strPathPrefix As String = "/MyPathSegment/"
Dim strTest As String = Regex.Replace("<a href=""/controller/action"" property=""something"">Hello World</a>", "(?<tag>(?:href|src)="")(?(?=" & strPathPrefix & ")(?!))/?(?<url>[^""]*"")", "${tag}/MyPathSegment/${url}")
strTest = <a href="/MyPathSegment/controller/action" property="something">Hello World</a>
Примечание что в VB мне пришлось удвоить кавычки.
С этим использованием, независимо от того, имеет ли вы Slash в настоящее время, не имеет значения. Вам просто нужно убедиться, что ваш strPathPrepend заканчивается на «/»
Протестируйте его на некоторых вещах и сообщите мне, если вы нажмете любые удары, которые могут потребовать некоторой настройки.
(?<tag>...
Данные следующие это должны быть захвачены в улавливающей группу под названием «тег».
(?:href|src)
матч Либо «href», либо «src». "?:»Означает не обязательно фиксировать результаты в это конкретное подвыражение, хотя результаты будут захватывать в родительском субе-выражение„метку“
=")
Захват знак равенства и процитировать символ буквально, и закрыть группу захвата . для «метки»
(?(...)...|...)
примера условного оператора IF-находится в небольшом подвыражении, то ТО левая сторона чередования «|», то ELSE находится на правой стороне чередования .
(?=...)
Пример Lookaround. В этом случае поиск - это «Look-Ahead». Это означает: проверьте, соответствует ли текст, следующий за текущей позицией, чем-то, но не продвигайте курсор.
(?(?=/MyPathSegment/)...
Итак, кладем наши два примера вместе, и мы получаем условие, которое говорит ... Если после сбора HREF =», мы находим/MyPathSegment /, то ...
(?!)
Это еще один Lookaround. Это отрицательный взгляд, но в нем ничего нет. Обычно это было бы (?! ...). Поскольку это отрицательный взгляд и он пуст, он автоматически выдает инструкцию Regex. если он видит, что ваш сегмент пути уже присутствует.
|/?
Else, если/MyPathSegment/не найден ... необязательно найти косую черту, но это не в группе захвата.
(?<url>...
Также в Else заявления ... После необязательного слэша, построить нашу второй захват группы под названием "URL"
[^"]*"
ничего, что не является Quote ... Несколько раз (дополнительного Capture , измените * на +, если вы хотите что-то потребовать), а затем, поймав все, что НЕ является цитатой, также запишите цитату в группу захвата «url».
))
Сначала закрывает группу захвата URL, затем закрывает условную группу.
Что это за/в? Например, для Apache существуют модули, которые могут переписывать URL-адреса «на лету». –
Это стандартное приложение .NET ASP.NET, размещенное на IIS, в среде, в которой я не контролирую, alas – blue18hutthutt