简体   繁体   中英

Markdown algorithm: string difficulties

I started writing this algorithm:

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;
}
}

So when I type, ####title, it returns < h4>title< /h4>

My problem is that when I write ####title###title, I would like it to return < h4>title< /h4> < h3>title< /h3> but it only returns < h4>title< /h4>...What am I doing wrong???

Thats because you are using the pattern: - #+.+ .

Now, since . matches everything in Regex, so in the above pattern, it matches everything after an initial set of #'s .

So, for your input: - ####title###title , your pattern will match: -

  • #+ will match ####
  • .+ will match title###title

You need to change your regex to : - (#+[^#]+) , and probably need to use Pattern class here to get the desired output, becaues you want to match every part of your string to the given pattern .

#+[^#]+ -> Will match the first set of # and then everything after that, except # . So it stops where the next set of #'s start.

Here's how you can use it: -

    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 + ">");
    }

OUTPUT : -

<h4>title</h4>
<h3>title</h3>

You are replacing only the first occurrence of #+. Try replacing the if with a while and instead of return inside the if, append the result into a StringBuilder.
Something like:

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

}

You are matching wrong string, try this one:

#+[^#]+

And of course you want to make call it recursivly or in a loop

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM