正则表达式:降价式链接匹配

时间:2010-05-24 05:22:39

标签: c# regex markdown

我想解析markdown样式链接,但是我在匹配参考样式链接时遇到了一些麻烦。像这样:[id]: http://example.com/ "Optional Title Here"

我的正则表达式获取id和url,但不是标题。

继承我所拥有的:

/\[([a-zA-Z0-9_-]+)\]: (\S+)\s?("".*?"")?/

我查看并添加对哈希表的引用。 id作为键,值是我创建的一个名为LinkReference的类的实例,它只包含url和title。如果问题不是我的正则表达式,并且我的代码将匹配添加到哈希表,那么我的代码也是如此:

        Regex rx = new Regex(@"\[([a-zA-Z0-9_-]+)\]: (\S+)\s?("".*?"")?");
        MatchCollection matches = rx.Matches(InputText);
        foreach (Match match in matches)
        {
            GroupCollection groups = match.Groups;
            string title = null;
            try
            {
                title = groups[3].Value;
            }
            catch (Exception)
            {
                // keep title null
            }
            LinkReferences.Add(groups[1].Value, new LinkReference(groups[2].Value, title));
        }

1 个答案:

答案 0 :(得分:4)

我认为您的URL和标题之间实际上有两个空格(它不会显示在Stack Overflow的呈现HTML中,但我可以在页面的源代码中看到它。 ..)

无论如何,我相信您要将\s?(0或1个空格)更改为\s*(0个或更多个空格):

var rx = new Regex(@"\[([a-zA-Z0-9_-]+)\]: (\S+)\s*("".*?"")?");

您可能还希望在“:”的两侧以及其他几个位置允许多个空格,如下所示:

var rx = new Regex(@"\[\s*([a-zA-Z0-9_-]+)\s*\]\s*:\s*(\S+)\s*("".*?"")?");

(允许空间自由,IMO没有坏处)