2012-10-21 47 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或循环