Java 标题的正则表达式匹配降价语法
Java regex match markdown syntax for headings
我有一个带有 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) 都会告诉我:"Redundant character escape"。每当我使用 \\# 时它都会这样做。据我所知,# 不应该是正则表达式中的特殊字符,所以用两个反斜杠转义它应该允许我使用它。
当我找到匹配项时,我想用粗体 HTML-tags 包围整个匹配项,如下所示:“###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。
- 如果我有“## This a heading”,那么它必须匹配 h2 的 true,但匹配 h1 的 false。
- 当我找到我的匹配项时,这个“## This a heading”变成了这个“## This a heading。
不需要转义 #
因为它不是特殊的正则表达式元字符。此外,^
是 字符串开始锚点 ,因此您模式中的所有后视都是多余的,因为它们总是 return true(因为字符串开头之前没有字符)。
您似乎想匹配指定数量的 #
字符前的字符。使用
String s = "###### Heading6 Something here\r\n" +
"###### More text \r\n" +
"###Heading 3 text";
Matcher m = Pattern.compile("(?m)^#{6}(?!#)(.*)").matcher(s);
String result = m.replaceAll("<b></b>");
System.out.println(result);
结果:
<b> Heading6 Something here</b>
<b> More text </b>
###Heading 3 text
详情:
(?m)
- 现在,^
匹配行首
^
- 行首
#{6}(?!#)
- 恰好 6 #
个符号
(.*)
- 第 1 组:0+ 个字符,除换行符外一直到行尾。
因此,您的正则表达式定义将类似于
h1 = Pattern.compile("(?m)^#(?!#)(.*)");
h2 = Pattern.compile("(?m)^#{2}(?!#)(.*)");
h3 = Pattern.compile("(?m)^#{3}(?!#)(.*)");
h4 = Pattern.compile("(?m)^#{4}(?!#)(.*)");
h5 = Pattern.compile("(?m)^#{5}(?!#)(.*)");
h6 = Pattern.compile("(?m)^#{6}(?!#)(.*)");
你可以试试this:
^(#{1,6}\s*[\S]+)
正如您所提到的,标题仅出现在一行的开头,因此您不需要向后看。
更新:
如果你想加粗以标题开头的整行,那么你可以试试这个:
^(#{1,6}.*)
并替换为:
<b></b>
样本Java来源:
final String regex = "^(#{1,6}\s*[\S]+)";
final String string = "#heading 1 \n"
+ "bla bla bla\n"
+ "### heading 3 djdjdj\n"
+ "bla bla bla\n"
+ "## heading 2 bal;kasddfas\n"
+ "fbla bla bla";
final String subst = "<b></b>";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
final String result = matcher.replaceAll(subst);
System.out.println(result);
我有一个带有 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) 都会告诉我:"Redundant character escape"。每当我使用 \\# 时它都会这样做。据我所知,# 不应该是正则表达式中的特殊字符,所以用两个反斜杠转义它应该允许我使用它。
当我找到匹配项时,我想用粗体 HTML-tags 包围整个匹配项,如下所示:“###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。
- 如果我有“## This a heading”,那么它必须匹配 h2 的 true,但匹配 h1 的 false。
- 当我找到我的匹配项时,这个“## This a heading”变成了这个“## This a heading。
不需要转义 #
因为它不是特殊的正则表达式元字符。此外,^
是 字符串开始锚点 ,因此您模式中的所有后视都是多余的,因为它们总是 return true(因为字符串开头之前没有字符)。
您似乎想匹配指定数量的 #
字符前的字符。使用
String s = "###### Heading6 Something here\r\n" +
"###### More text \r\n" +
"###Heading 3 text";
Matcher m = Pattern.compile("(?m)^#{6}(?!#)(.*)").matcher(s);
String result = m.replaceAll("<b></b>");
System.out.println(result);
结果:
<b> Heading6 Something here</b>
<b> More text </b>
###Heading 3 text
详情:
(?m)
- 现在,^
匹配行首^
- 行首#{6}(?!#)
- 恰好 6#
个符号(.*)
- 第 1 组:0+ 个字符,除换行符外一直到行尾。
因此,您的正则表达式定义将类似于
h1 = Pattern.compile("(?m)^#(?!#)(.*)");
h2 = Pattern.compile("(?m)^#{2}(?!#)(.*)");
h3 = Pattern.compile("(?m)^#{3}(?!#)(.*)");
h4 = Pattern.compile("(?m)^#{4}(?!#)(.*)");
h5 = Pattern.compile("(?m)^#{5}(?!#)(.*)");
h6 = Pattern.compile("(?m)^#{6}(?!#)(.*)");
你可以试试this:
^(#{1,6}\s*[\S]+)
正如您所提到的,标题仅出现在一行的开头,因此您不需要向后看。
更新: 如果你想加粗以标题开头的整行,那么你可以试试这个:
^(#{1,6}.*)
并替换为:
<b></b>
样本Java来源:
final String regex = "^(#{1,6}\s*[\S]+)";
final String string = "#heading 1 \n"
+ "bla bla bla\n"
+ "### heading 3 djdjdj\n"
+ "bla bla bla\n"
+ "## heading 2 bal;kasddfas\n"
+ "fbla bla bla";
final String subst = "<b></b>";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
final String result = matcher.replaceAll(subst);
System.out.println(result);