我有一个我正在使用的.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>
。
但是,我想处理引号可以作为"
的情况。即{link name="Link 2" url="http://www.google.com"}
,但我仍然希望在原始输出中进行渲染。
目前,我有(?<link>{link name=[\"|<">](?<name>[^\"]*)[\"|<">] url=[\"|<">](?<url>[^\"]*)[\"|<">]})
匹配,但返回<a target=\"_blank\" href="\quot;http://www.google.com"\">quot;Link 2"</a>
。
对于我的生活,我无法弄清楚如何不在"
和<name>
值中包含<url>
。
答案 0 :(得分:1)
您不需要在(?: ... )
中使用内部(?:\"|(?:"))
;并像这样使用它:
(?:\"|")
您可能会做的事情是确保没有与"
和"
的链接,您实际上可以捕获引号并像这样使用它:
(?<link>{link name=(\"|")(?<name>(?:(?!\2).)*)\2 url=(\"|")(?<url>(?:(?!\4).)*)\4})
基本上,\2
是对第二次捕获的反向引用(它可以是"
或"
)然后,而不仅仅是[^\"]
,您也将是能够阻止引号内"
与(?:(?!\2).)*
的匹配。链接也会发生同样的事情。
如果您现在知道名称和网址的引号始终相同,则可以删除第二个引号:
(?<link>{link name=(\"|")(?<name>(?:(?!\2).)*)\2 url=\2(?<url>(?:(?!\2).)*)\2})
答案 1 :(得分:0)
一位同事教我关于被动匹配。
对于某些部分而不是[]
,我本应该使用()
。然后为了确保不返回这些部分,我可以使用(?:)
来阻止它们作为替换的匹配项返回。
我的正则表达式为(?<link>{link name=(?:\"|(?:"))(?<name>[^\"]*)(?:\"|(?:")) url=(?:\"|(?:"))(?<url>[^\"]*)(?:\"|(?:"))})