我开始编写这个算法:
public static String convert(String str) {
if (str.equals("# "))
return " ";
if (str.matches("#+.+")) {
int n = str.length() - str.replaceFirst("#+", "").length();
return "<h" + n + ">" + str.substring(n) + "<h" + n + ">";
}
return str;
}
}
所以当我输入#### title时,它会返回&lt; H4&GT;标题&LT; / H4&GT;
我的问题是,当我写#### title ### title时,我希望它返回&lt; H4&GT;标题&LT; / H4&GT; &LT; H3&GT;标题&LT; / H3&GT;但它只返回&lt; H4&GT;标题&LT; /h4> ...。我做错了什么???
答案 0 :(得分:0)
那是因为您使用的模式: - #+.+
。
现在,由于.
匹配正则表达式中的所有内容,因此在上述模式中,它与everything
initial set
之后的#'s
匹配。
因此,对于您的输入: - #### title ### title ,您的模式将匹配: -
#+
将匹配####
.+
将匹配title###title
您需要将正则表达式更改为: - (#+[^#]+)
,并且可能需要在此处使用Pattern类来获取所需的输出,因为您希望匹配字符串的every
部分到给定的pattern
。
#+[^#]+
- &gt;将匹配第一组#
,然后匹配#
以外的所有内容。所以它停在下一组#'s
开始的地方。
以下是如何使用它: -
String str = "####title###title"; // str is the method parameter
if (str.equals("# "))
System.out.println(" ");
Pattern pattern = Pattern.compile("(#+[^#]+)");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
String str1 = matcher.group(1);
int n = str1.length() - str1.replaceFirst("#+", "").length();
System.out.println("<h" + n + ">" + str1.substring(n) + "</h" + n + ">");
}
输出: -
<h4>title</h4>
<h3>title</h3>
答案 1 :(得分:0)
您只替换第一次出现的#+。尝试用if替换if,而不是在if中返回,将结果附加到StringBuilder中。
类似的东西:
String str = "####title###title2";
StringBuilder sb = new StringBuilder();
while (str.matches("#+.+")) {
int n = str.length() - str.replaceFirst("#+", "").length();
str = str.replaceFirst("#+", "");
int y = str.length();
if(str.matches(".+#+.+")) {
y = str.indexOf("#");
sb.append( "<h" + n + ">" + str.substring(0,y) + "<h" + n + ">");
str = str.substring(y, str.length());
} else {
sb.append( "<h" + n + ">" + str.substring(0,y) + "<h" + n + ">");
}
}
System.out.println(sb.toString());
}
答案 2 :(得分:0)
你匹配错误的字符串,试试这个:
#+[^#]+
当然,您希望以递归方式或循环方式进行调用