Java 降价算法:字符串困难

Java 降价算法:字符串困难,java,string,markdown,Java,String,Markdown,我开始写这个算法: 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

我开始写这个算法:

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;
}
}
公共静态字符串转换(字符串str){
if(str.equals(“#”)
返回“”;
if(str.matches(“#+.+”){
int n=str.length()-str.replaceFirst(“#+”,“”)。length();
返回“+str.substring(n)+”;
}
返回str;
}
}
因此,当我键入#####title时,它返回

title


我的问题是,当我写###########title时,我希望它返回

title

title

,但它只返回

title

…我做错了什么?

这是因为您使用的模式:-
+

现在,由于
匹配Regex中的所有内容,因此在上面的模式中,它在
#的
初始设置
后匹配
所有内容

因此,对于您的输入:-#####title####title,您的模式将匹配:-

  • #+
    将匹配
    ####
  • +
    将匹配
    标题###标题
您需要将正则表达式更改为:-
(#+[^#]+)
,并且可能需要在此处使用类来获得所需的输出,因为您希望将字符串的
每一部分都匹配到给定的
模式

#+[^#]+
->将匹配第一组
#
,然后匹配除
#
之外的所有内容。因此,它在下一组
#的开始处停止

以下是如何使用它:-

    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 + ">");
    }
String str=“#####title####title”//str是方法参数
if(str.equals(“#”)
System.out.println(“”);
Pattern=Pattern.compile(“(#+[^#]+)”;
Matcher-Matcher=pattern.Matcher(str);
while(matcher.find()){
字符串str1=matcher.group(1);
int n=str1.length()-str1.replaceFirst(“#+”,“”)。length();
System.out.println(“+str1.substring(n)+”);
}
输出:-

<h4>title</h4>
<h3>title</h3>
标题
标题

您只替换第一次出现的#+。尝试用while替换if,并将结果附加到StringBuilder中,而不是在if中返回。
比如:

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());

}
String str=“#########title2”;
StringBuilder sb=新的StringBuilder();
而(str.matches(“#+.+”){
int n=str.length()-str.replaceFirst(“#+”,“”)。length();
str=str.replaceFirst(“#+”,“”);
int y=str.length();
if(str.matches(“.+.+.+”){
y=str.indexOf(“#”);
sb.追加(“+str.substring(0,y)+”);
str=str.substring(y,str.length());
}否则{
sb.追加(“+str.substring(0,y)+”);
}
}
System.out.println(sb.toString());
}

您匹配了错误的字符串,请尝试以下方法:

#+[^#]+

当然,您希望递归地或在循环中调用它

您的代码没有给出所需的输出。还有一个编译器错误。您在string.yhea中使用了
length
而不是
length()