Skip to main content
 首页 » 编程设计

c#之正则表达式: Markdown 式链接匹配

2024年02月24日38kenshinobiy

我想解析 Markdown 样式链接,但在匹配引用样式链接时遇到了一些问题。像这个:[id]: http://example.com/"Optional Title Here"

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

这是我所拥有的:

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

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

        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)); 
        } 

请您参考如下方法:

我认为您的 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,在允许空格方面保持自由并没有坏处)