我有一个包含Markdown语法的字符串,我想找到标题的Markdown语法,例如h1=#,h2=##等等。
我知道每当我找到一个标题时,它都在行的开头。我还知道每行只能有一个标题。例如,“###这是一个标题”将匹配我的h3模式,但不会匹配我的h2或h1模式。这是我目前的代码:
每当我使用\\#时,我的编译器(IntelliJ)会告诉我:“冗余字符转义”。只要我使用\\#它就会这样做。据我所知,在正则表达式中,#不应该是一个特殊字符,因此用两个反斜杠来转义它应该允许我使用它。
当我找到匹配项时,我想用粗体HTML标签把整个匹配项括起来,就像这样:"###标题",但出于某种原因它不起作用。
我知道每当我找到一个标题时,它都在行的开头。我还知道每行只能有一个标题。例如,“###这是一个标题”将匹配我的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标签把整个匹配项括起来,就像这样:"###标题",但出于某种原因它不起作用。
//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>")
。 - Wiktor Stribiżew#
序列开头的行,请参考我的更新答案。始终将新细节添加到问题本身,而不仅仅是评论中。 - Wiktor Stribiżew