如何在Markdown中匹配普通文本URL?

3

我目前正在尝试匹配Markdown文本中的所有纯文本链接。

Markdown文本示例:

Dude, look at this url http://www.google.com .. it's a great search engine

我希望它能够转换为。
Dude, look at this url <http://www.google.com> .. it's a great search engine

简而言之,处理普通文本中的url应该变成<url>,但处理现有的<url>不应该变成<<url>>。此外,Markdown中的链接可以采用(url)的形式,因此我们需要避免匹配普通的括号。
在Java中,我用于匹配纯文本URL的工作正则表达式是:"[^(\\<|\\(](https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|][^(\\>|\\)]",其中使用了[^(\\<|\\(][^(\\>|\\)]来避免匹配包含在尖括号或圆括号中的URL。
但是问题在于,我也不想匹配这种类型的URL:
[1]: http://slashdot.org

所以,如果Markdown文本如下:

Dude, look at this url http://www.google.com .. it's a great search engine
[1]: http://slashdot.org

我希望只匹配http://www.google.com,而不是http://slashdot.org

我想知道满足这个标准的模式是什么?


你对这两者有什么区分标准?是点的数量吗?还是URL以.org结尾? - oyss
1
你真的想使用正则表达式吗?我不确定你能否用它们处理代码块和列表。为什么不修改解析器呢? - Ciro Santilli OurBigBook.com
当询问关于正则表达式的问题时,不要忘记指定您的编程语言。这非常重要,因为有些语言例如不支持负向后查找... - Denys Séguret
1
@dystroy 这个还太复杂了,无法写出一个匹配模式。我正在考虑使用负向零宽断言 (?<!...) 来排除这个模式。 - oyss
@dystroy:啊,我的错。我在问题中提到了Java,但忘记打标签了。 - Bertie
显示剩余2条评论
1个回答

2
你所面临的问题是解析问题。正则表达式是可以使用的,但是仅使用正则表达式将使其变得混乱(假设你能实现它)。解决此问题后,您可能会发现自己面对其他问题,例如代码中的URL(在`或以制表符或四个空格开头的行之间)不希望替换。
一种解决方案是将文本分成行,然后:
  1. 检测模式(例如^\[\d+\]:\s+
  2. 仅在不遵循不兼容模式的行上应用替换(例如将此URL更改为链接)
这是我在这个小伪markdown解析器中使用的逻辑,您可以在这里进行测试。
请注意,始终有使用现有经过验证的markdown解析器的解决方案,其中有许多这样的解析器可供选择。

是的,我正在研究它。我目前正在使用txtmark解析器。感谢您的帮助! - Bertie
@bjb568 谢谢。已修复。 - Denys Séguret

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接