C# 匹配特定单词的正则表达式+;括号内的内容
我正在创建一个post系统,在该系统中,我将使用[image:http://anything/anyimage.jpg]或[silverlight:http://anothersite/ilovesilverlight.xap]等等,我将在找到链接后呈现HTML的对象标记。我被regex困住了,我对regex很陌生,所以请在回答时保持建设性,这有什么问题:C# 匹配特定单词的正则表达式+;括号内的内容,c#,regex,regex-negation,C#,Regex,Regex Negation,我正在创建一个post系统,在该系统中,我将使用[image:http://anything/anyimage.jpg]或[silverlight:http://anothersite/ilovesilverlight.xap]等等,我将在找到链接后呈现HTML的对象标记。我被regex困住了,我对regex很陌生,所以请在回答时保持建设性,这有什么问题: if (text.Contains("[flash:")) { rgx = new
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块,但找不到任何与regex匹配的实例,尽管我已经找到了。我可以在一篇文章中包含多个外部对象,所以我要做的是否定匹配中的]
字符。如果我不否定]
,如果我只有一个对象而没有其他]
字符,那就没有问题了,但是如果我有更多的]
,那么一切都会变得一团糟,因为第一个正则表达式与整个帖子上最后出现的]
匹配,并将整个帖子的其余部分作为假定的“URL”返回.试试这个:
newregex(@“\[flash:([^\]]+)\]”;
\[flash:#前缀
(#捕获组
[^\]+#一个或多个字符,除了]
) #
\]#后缀
试试这个:
newregex(@“\[flash:([^\]]+)\]”;
\[flash:#前缀
(#捕获组
[^\]+#一个或多个字符,除了]
) #
\]#后缀
您可以使用所谓的“非贪婪量词”,这意味着它在仍然匹配的情况下尽可能少地吃掉字符,而默认(贪婪)量词在仍然匹配的情况下吃掉尽可能多的字符。在量词(如*
或+
)后面加一个?
,使其不贪婪:
new Regex(@"\[flash:(.+?)\]");
您可以使用所谓的“非贪婪量词”,这意味着它在仍然匹配的情况下尽可能少地吃掉字符,而默认(贪婪)量词在仍然匹配的情况下吃掉尽可能多的字符。在量词(如
*
或+
)后面加一个?
,使其不贪婪:
new Regex(@"\[flash:(.+?)\]");
是的!它起作用了。只是为了测试我的理解:在正常的偏执狂论文中,它完全匹配“任何至少1个字符的文本,但不包括文字
]
”,这是正确的,只是为了看看我是否得到了正确的答案?是的!它起作用了。只是为了检验我的理解:在正常的偏执狂论文中,它完全匹配“任何至少1个字符的文本,但不包括文字]
”这是不是正确的,只是为了看看我是否得到了正确的答案?另一个答案也很有效,那么答案之间的技术区别是什么?它们到底有什么不同之处?@can:在这种情况下,它们的工作原理是相同的,但我的解决方案略短,而且(在我看来)更容易阅读。在其他情况下,像dtb这样的解决方案将不起作用。例如,如果没有非贪婪量词(
),您可能无法匹配XML注释。XML注释不能包含--
,因此您实际上需要类似
@dtb的内容:也许我应该说“怪癖模式HTML注释”?另一个答案也可以,那么答案之间的技术区别是什么?它们到底有什么不同之处?@can:在这种情况下,它们的工作原理是相同的,但我的解决方案略短,而且(在我看来)更容易阅读。在其他情况下,像dtb这样的解决方案将不起作用。例如,如果没有非贪婪量词(
),您可能无法匹配XML注释。XML注释不能包含--
,因此您实际上需要类似
@dtb的内容:也许我应该说“怪癖模式HTML注释”?