【发布时间】:2017-09-24 13:37:41
【问题描述】:
我有一个带有 markdown 语法的字符串,我希望能够找到标题的 markdown 语法,即 h1 = #、h2 = ## 等。
我知道每当我找到一个标题时,它就位于行首。我也知道每行只能有一个标题。例如,“###This is a heading”将匹配我的 h3 模式,但不匹配我的 h2 或 h1 模式。到目前为止,这是我的代码:
h1 = Pattern.compile("(?<!\\#)^\\#(\\b)*");
h2 = Pattern.compile("(?<!\\#)^\\#{2}(\\b)*");
h3 = Pattern.compile("(?<!\\#)^\\#{3}(\\b)*");
h4 = Pattern.compile("(?<!\\#)^\\#{4}(\\b)*");
h5 = Pattern.compile("(?<!\\#)^\\#{5}(\\b)*");
h6 = Pattern.compile("(?<!\\#)^\\#{6}(\\b)*");
每当我使用 \\# 时,我的编译器 (IntelliJ) 都会告诉我:“冗余字符转义”。每当我使用 \\# 时,它都会这样做。据我所知,# 不应该是正则表达式中的特殊字符,所以用两个反斜杠转义它应该允许我使用它。
当我找到匹配项时,我想用粗体 HTML 标记包围整个匹配项,例如:“###Heading”,但由于某种原因它不起作用
//check for heading 6
Matcher match = h6.matcher(tmp);
StringBuffer sb = new StringBuffer();
while (match.find()) {
match.appendReplacement(sb, "<b>" + match.group(0) + "</b>");
}
match.appendTail(sb);
tmp = sb.toString();
编辑
所以我必须分别查看每个标题,我不能以相同的模式查看标题 1-6(这与我的程序中使用相同模式的其他部分有关)。到目前为止我所知道的:
- 如果字符串中有标题,则在开头。
- 如果它以标题开头,则后面的整个字符串都被视为标题,直到用户按 Enter。
- 如果我有“## 这是一个标题”,那么它必须匹配 h2 的 true,但匹配 h1 的 false。
- 当我找到我的匹配项时,这个“## 这是一个标题”变成了这个“## 这是一个标题。
【问题讨论】:
-
您不必逃避
#。你甚至不需要Matcher#appendReplacement这里。您可以使用"(?<!#)#{6}\\b",然后使用简单的tmp = tmp.replaceAll("(?<!#)#{6}\\b", "<b>$0</b>") -
@WiktorStribiżew 我试过你的解决方案,但问题是匹配只返回 #:s,而不是后面的文本
-
如果您需要匹配 以
#序列开头的行,请参阅我的更新答案。总是向问题本身添加新的细节,而不仅仅是 cmets。 -
@WiktorStribiżew 抱歉,对这个有点陌生。现在看看你的答案。另外,问题已更新:)
-
好,我投了赞成票,因为这是一个展示努力的好问题。而现在,真的清晰多了。
标签: java html regex markdown stringbuffer