0

我开始写这个算法:

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 时,它​​会返回 <h4>title</h4>

我的问题是当我写####title###title时,我希望它返回<h4>title</h4><h3>title</h3>但它只返回<h4>title</h4 >...我做错了什么???

4

3 回答 3

0

那是因为您使用的是模式: - #+.+

现在,因为.匹配正则表达式中的所有内容,所以在上面的模式中,它匹配everything一个initial setof之后#'s

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

  • #+将匹配####
  • .+将匹配title###title

您需要将您的正则表达式更改为 : - (#+[^#]+),并且可能需要在此处使用Pattern类来获得所需的输出,因为您希望将every部分字符串与给定的pattern.

#+[^#]+-> 将匹配第一组,#然后匹配之后的所有内容,除了#. 所以它停在下一组#'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>
于 2012-10-21T22:23:44.697 回答
0

您只替换第一次出现的#+。尝试用一段时间替换 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());

}
于 2012-10-21T22:24:08.483 回答
0

您匹配错误的字符串,试试这个:

#+[^#]+

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

于 2012-10-21T22:24:23.720 回答