我正在创建一个帖子系统,我将使用[image:http://anything/anyimage.jpg]或[silverlight:http://anothersite/ilovesilverlight.xap]标记外部图像,Flash,SL等等等。我将在找到链接后呈现HTML的对象标签。我坚持使用正则表达式,我对正则表达式很陌生,所以请在回答时保持建设性,这有什么问题:
if (text.Contains("[flash:"))
{
rgx = new Regex(@"\[flash:(.^\])\]");
text = rgx.Replace(text, (m =>
{
string val = m.Groups[1].Value;
FlashRenderer ir = new FlashRenderer(val);
return ir.Render();
}));
}
忘记FlashRenderer
及其返回的内容,我的问题在于匹配。
我进入if块,但找不到与正则表达式匹配的任何实例,尽管我有。我可以在一个帖子中有多个外部对象,所以我要做的是否定匹配中的]
字符。如果我不否定]
,如果我在任何地方只有一个对象而没有其他]
个字符就没有问题,但如果我有更多]
个,那么一切都搞砸了因为第一个正则表达式匹配整个帖子中]
的最后一次出现,并将整个帖子的其余部分作为所谓的“URL”返回。
答案 0 :(得分:3)
你可以使用所谓的“非贪婪量词”,这意味着它在仍然匹配的同时吃尽可能少的字符,而默认(贪婪)量词尽可能多地吃掉仍然匹配的字符。您可以通过在*
之后添加+
来使量词(如?
或new Regex(@"\[flash:(.+?)\]");
)非贪婪:
{{1}}
答案 1 :(得分:2)
试试这个:
new Regex(@"\[flash:([^\]]+)\]");
\[flash: # prefix
( # capture group
[^\]]+ # one or more characters except ]
) #
\] # suffix