2012-10-21 78 views
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; 
} 
} 

所以,當我鍵入,####標題,它返回< H4>標題</H4>

我的問題是,當我寫####標題###標題時,我希望它返回< h4>標題</h4> < h3>標題</h3>但它只返回< h4>標題</h4> ...我究竟做錯了什麼???

回答

0

那是因爲您正在使用的模式: - #+.+

現在,由於.在正則表達式匹配的一切,所以在上面的圖案,它的#'s一個initial set後匹配everything

因此,對於您輸入: - ####標題###標題,你的模式會匹配: -

  • #+將匹配####
  • .+將匹配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> 
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()); 

} 
+0

你的代碼沒有按沒有給出所需的輸出。並且有一個編譯器錯誤。你使用'length'而不是'length()'和字符串。 –

+0

yhea,好吧,我已經在我的回答 – breezee

+0

中提到了「類似」,修正了上面的代碼,編譯和輸出的權利。 – breezee

0

您匹配錯了弦,試試這個:

#+[^#]+ 

當然,你想叫它recursivly或循環