您想找到一个 URL,断言该 URL 当前不包含 /MyPathSegment/,并将其替换为相同的属性(href 或 src)和相同的 End-Of-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>...
这之后的数据应该被捕获到一个名为“tag”的捕获组中。
(?:href|src)
匹配“href”或“src”。“?:”意味着不一定将结果捕获到该特定子表达式中,尽管结果将捕获到父子表达式“标签”中
=")
从字面上捕获等号和引号,并关闭“tag”的捕获组
(?(...)...|...)
示例条件语句。IF 在小子表达式中,THEN 在交替“|”的左侧,ELSE 在交替的右侧。
(?=...)
示例环视。在这种情况下,环视是“前瞻”。这意味着:检查当前位置后面的文本是否等于某个值,但不要前进光标。
(?(?=/MyPathSegment/)...
所以,把我们的两个例子放在一起,我们得到一个条件,它说......如果在收集 href=" 之后,我们找到 /MyPathSegment/,那么......
(?!)
这是另一个环视。这是一个负前瞻。但是里面什么都没有。通常是(?!...)。由于它是一个负前瞻并且它是空的,它会自动使 Regex 语句失败。如果它看到您的路径段已经在那里,我们希望它失败。
|/?
否则,如果 /MyPathSegment/ 未找到...可选地找到一个斜杠,但它不在捕获组中。
(?<url>...
同样在 Else 语句中......在可选斜杠之后,构建我们的第二个捕获组,名为“url”
[^"]*"
捕获任何不是引用的内容...多次(可选,如果您需要某些内容,将 * 更改为 +),然后在捕获所有不是引用的内容之后...也将引用捕获到“url”捕获组中.
))
先关闭url捕获组,再关闭条件组。