0

我有一个用于替换的 .NET Regex,我想更新它。

string rxp = "(?<link>{link name=\"(?<name>[^\"]*)\" url=\"(?<url>[^\"]*)\"})";
input = Regex.Replace(input, rxp, "<a target=\"_blank\" href=\"$3\">$2</a>", RegexOptions.IgnoreCase);

此正则表达式将成功捕获{link name="Link 2" url="http://www.google.com"}并将其转换为<a target=\"_blank\" href="\http://www.google.com\">Link 2</a>.

但是,我想处理引号可能以&quot;. 即{link name=&quot;Link 2&quot; url=&quot;http://www.google.com&quot;},但我仍然希望它在原始输出中呈现。

目前,我有(?<link>{link name=[\"|<&quot;>](?<name>[^\"]*)[\"|<&quot;>] url=[\"|<&quot;>](?<url>[^\"]*)[\"|<&quot;>]})which 匹配,但返回<a target=\"_blank\" href="\quot;http://www.google.com&quot\">quot;Link 2&quot</a>.

对于我的一生,我无法弄清楚如何不包含&quot;在返回的<name>and<url>值中。

4

2 回答 2

1

您不需要使用内部(?: ... )in (?:\"|(?:&quot;)); 并像这样使用它:

(?:\"|&quot;)

但是,您可能会做一些事情来确保两者都没有链接"and &quot;,您实际上可以捕获引号并像这样使用它:

(?<link>{link name=(\"|&quot;)(?<name>(?:(?!\2).)*)\2 url=(\"|&quot;)(?<url>(?:(?!\4).)*)\4})

正则表达式101演示

基本上,\2是对第二次捕获的反向引用(它将是"or &quot;),然后,[^\"]您还可以防止&quot;引号本身与. 匹配,而不仅仅是(?:(?!\2).)*. 链接也会发生同样的事情。

如果现在您知道名称和 url 的引号始终相同,则可以删除第二次引号捕获:

(?<link>{link name=(\"|&quot;)(?<name>(?:(?!\2).)*)\2 url=\2(?<url>(?:(?!\2).)*)\2})
于 2013-10-15T07:55:35.370 回答
0

一位同事教我被动匹配。

而不是[]某些部分,我应该一直使用(). 然后为了确保这些零件不会被退回,我可以使用它(?:)来防止它们被退回作为替换的匹配项。

我得到的正则表达式是(?<link>{link name=(?:\"|(?:&quot;))(?<name>[^\"]*)(?:\"|(?:&quot;)) url=(?:\"|(?:&quot;))(?<url>[^\"]*)(?:\"|(?:&quot;))})

于 2013-10-15T04:51:13.353 回答