正则表达式剥离字符替换

时间:2013-10-15 03:56:33

标签: .net regex

我有一个我正在使用的.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;>]})匹配,但返回<a target=\"_blank\" href="\quot;http://www.google.com&quot\">quot;Link 2&quot</a>

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

2 个答案:

答案 0 :(得分:1)

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

(?:\"|&quot;)

您可能会做的事情是确保没有与"&quot;的链接,您实际上可以捕获引号并像这样使用它:

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

regex101 demo

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

如果您现在知道名称和网址的引号始终相同,则可以删除第二个引号:

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

答案 1 :(得分:0)

一位同事教我关于被动匹配。

对于某些部分而不是[],我本应该使用()。然后为了确保不返回这些部分,我可以使用(?:)来阻止它们作为替换的匹配项返回。

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