如何在降价中匹配纯文本URL?

时间:2013-12-18 09:00:40

标签: regex 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>>。此外,降价中的链接可以采用(url)的形式,因此我们也必须避免匹配普通括号。

所以我在java中匹配纯文本url的工作正则表达式是: "[^(\\<|\\(](https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|][^(\\>|\\)]"

使用[^(\\<|\\(][^(\\>|\\)]以避免匹配包装括号。

但是这里有一个问题,我也想要匹配这种网址:

[1]: http://slashdot.org

所以,如果降价文字是

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

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

1 个答案:

答案 0 :(得分:2)

这里有一个解析问题。正则表达式很好,但只是在这里使用正则表达式将使它变得一团糟(假设你实现它)。修复此问题后,您可能会发现自己面临其他问题,例如代码中的URL(在`或以制表符开头的行或四个空格之间),您不想替换它们。

解决方案是分成行然后

  1. 检测模式(例如^\[\d+\]:\s+
  2. 仅在不遵循不兼容模式的行上应用您的替换(例如此URL链接更改)
  3. 这是我在this small pseudo-markdown parser中使用的逻辑,您可以测试here

    请注意,使用现有的已证明的降价解析器始终存在解决方案,其中有许多解析器。