繁体   English   中英

如何使用正则表达式找到所有 Markdown 链接?

[英]How can I find all Markdown links using regular expressions?

在 Markdown 中有两种放置链接的方法,一种是直接输入原始链接,例如: http://example.com ,另一种是使用()[]语法: (Stack Overflow)[ http://example.com ]

我正在尝试编写一个可以匹配这两个的正则表达式,并且,如果它是第二个匹配也捕获显示字符串。

到目前为止,我有这个:

(?P<href>http://(?:www\.)?\S+.com)|(?<=\((.*)\)\[)((?P=href))(?=\])

正则表达式可视化

调试器演示

但这似乎与我在 Debuggex 中的两个测试用例中的任何一个都不匹配:

http://example.com
(Example)[http://example.com]

真的不确定为什么第一个至少不匹配,这与我使用命名组有关吗? 其中,如果可能的话,我想继续使用,因为这是匹配链接的简化表达式,在实际示例中,将它复制到同一模式的两个不同位置对我来说太长了。

我究竟做错了什么? 或者这根本不可行?

编辑:我在 Python 中这样做,所以将使用他们的正则表达式引擎。

您的模式不起作用的原因在这里: (?<=\\((.*)\\)\\[)因为 Python 的 re 模块不允许可变长度后视。

您可以使用Python 的新 regex 模块以更方便的方式获得您想要的内容(因为 re 模块相比之下功能很少)

示例: (?|(?<txt>(?<url>(?:ht|f)tps?://\\S+(?<=\\P{P})))|\\(([^)]+)\\)\\[(\\g<url>)\\])

在线演示

图案细节:

(?|                                       # open a branch reset group
    # first case there is only the url
    (?<txt>                               # in this case, the text and the url  
        (?<url>                           # are the same
            (?:ht|f)tps?://\S+(?<=\P{P})
        )
    )
  |                                       # OR
    # the (text)[url] format
    \( ([^)]+) \)                         # this group will be named "txt" too 
    \[ (\g<url>) \]                       # this one "url"
)

此模式使用分支重置功能(?|...|...|...) ,该功能允许在交替中保留捕获组名称(或数字)。 在模式中,由于?<txt>组首先在交替的第一个成员中打开,因此第二个成员中的第一个组将自动具有相同的名称。 ?<url>组也是如此。

\\g<url>是对命名子模式?<url>的引用(就像一个别名,这样,不需要在第二个成员中重写它。)

(?<=\\P{P})检查 url 的最后一个字符是否不是标点字符(例如用于避免结束方括号)。 (我不确定语法,它可能是\\P{Punct}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM