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

それは、パターンを使用しているためです: - #+.+

今、.正規表現のすべてに一致するため、上記のパターンでは、 of のeverything後に一致します。initial set#'s

したがって、あなたの入力に対して: - ####title###title、あなたのパターンは一致します: -

  • #+一致します####
  • .+一致しますtitle###title

正規表現を : - に変更する必要があり、(#+[^#]+)文字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 を while に置き換えて、if 内で return する代わりに、結果を 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 に答える