【问题标题】:How to match plain text URL in a markdown?如何在降价中匹配纯文本 URL?
【发布时间】:2013-12-18 09:00:39
【问题描述】:

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

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 应该变成&lt;url&gt;,但处理现有的&lt;url&gt; 不应该变成&lt;&lt;url&gt;&gt;。另外,markdown 中的链接可以是(url) 的形式,所以我们也必须避免匹配正常的括号。

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

使用[^(\\&lt;|\\(][^(\\&gt;|\\)] 以避免匹配换行括号。

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

[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

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

【问题讨论】:

  • 在我自己的 Markdown 解析器中,我通过逐行解析来处理此类问题,如果检测到某些模式(例如 [1]:),则根本不进行替换
  • 两者之间的标准是什么?点数?还是网址以 .org 结尾?
  • @oyss 很明显是前面括号之间有整数的时候。
  • 你真的要使用正则表达式吗?我不确定您是否可以与它们一起处理代码块+列表。为什么不修改解析器?
  • @dystroy 仍然过于狂野,无法为其编写模式。我正在考虑使用 (?

标签: regex markdown


【解决方案1】:

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

解决方案是分成几行,然后

  1. 检测模式(例如^\[\d+\]:\s+
  2. 仅在不遵循不兼容模式的行上应用您的替换(例如此 URL 以更改链接)

这就是我在this small pseudo-markdown parser 中使用的逻辑,您可以测试here

请注意,使用现有的经过验证的降价解析器总是有解决方案,其中有很多。

【讨论】:

  • 是的,我现在正在调查。我目前正在使用 txtmark 解析器。感谢您的帮助!
  • @bjb568 谢谢。固定
猜你喜欢
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 2019-01-12
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
相关资源
最近更新 更多