你想要找到一個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中,我不得不加倍報價。
有了這個用法,無論你是否有一個斜槓目前是無關緊要的。你只需要確保你的strPathPrepend以「/」結尾
在一些事情上測試它,讓我知道如果你碰到任何可能需要調整的顛簸。
(?<tag>...
下面這個數據應該被捕獲到一個名爲「標籤」捕獲組。
(?:href|src)
匹配「href」或「src」。 「?:」表示不必然捕獲結果到該特定子表達式,雖然結果將捕捉到父子表達的‘標籤’
=")
捕獲等號和報價符號字面上,並關閉捕獲組。對於「標籤」
(?(...)...|...)
實施例的條件語句中的IF是在小的子表達式中,THEN是交替的左側「|」,在ELSE是在交替的右側。
(?=...)
示例Lookaround。在這種情況下,查找結果是「預測」。這意味着:檢查當前位置之後的文本是否等於某些內容,但不要超前光標。
(?(?=/MyPathSegment/)...
所以,把我們的兩個例子在一起,我們得到了一個有條件它說...如果,收集HREF =後」,我們發現/ MyPathSegment /,然後...
(?!)
這是另一種Lookaround,它是一個負向前瞻,但它沒有任何內容,通常它會是(?!...),因爲它是一個負向前瞻,它是空的,它會自動失敗正則表達式。如果它看到您的路徑段已經存在,則失敗。
|/?
否則,if/MyPathSegment /未找到...可以選擇查找斜槓,但它不在捕獲組中。
(?<url>...
而且else語句...可選的斜線後,建立我們的第二個捕獲組命名爲「URL」
[^"]*"
捕捉任何不報價...多次(可選,如果你想要求某些東西,則將*更改爲+),然後捕捉所有不是引用的內容...並將引用捕獲到「url」捕獲組中。
))
首先關閉網址捕獲組,然後關閉條件組。
這對於/ in是什麼?例如,Apache的模塊可以在運行中重寫URL。 – 2013-05-08 15:48:34
這是一個標準的.NET ASP.NET應用程序託管在IIS上,在我無法控制的環境中,唉 – blue18hutthutt 2013-05-08 17:45:14