31

可変長のJava文字列があります。

ピース"<br>"を文字列に入れる必要があります。たとえば、10 文字ごとです。

たとえば、これは私の文字列です:

`this is my string which I need to modify...I love stackoverlow:)`

この文字列を取得するにはどうすればよいですか?:

`this is my<br> string wh<br>ich I nee<br>d to modif<br>y...I love<br> stackover<br>flow:)`

ありがとう

4

12 に答える 12

52

試す:

String s = // long string
s.replaceAll("(.{10})", "$1<br>");

編集:上記の作品...ほとんどの場合。私はそれをいじっていて、問題に遭遇しました.デフォルトのパターンを内部的に構築するため、改行で停止します。これを回避するには、別の方法で記述する必要があります。

public static String insert(String text, String insert, int period) {
    Pattern p = Pattern.compile("(.{" + period + "})", Pattern.DOTALL);
    Matcher m = p.matcher(text);
    return m.replaceAll("$1" + insert);
}

鋭い読者は別の問題に気付くでしょう: 置換テキストで正規表現の特殊文字 (「$1」など) をエスケープする必要があります。そうしないと、予測できない結果が得られます。

私も興味を持ち、このバージョンを上記の Jon と比較してベンチマークしました。これは桁違いに遅いです (60k ファイルの 1000 回の置換はこれで 4.5 秒、彼では 400 ミリ秒かかりました)。4.5 秒のうち、実際にパターンを構築していたのは約 0.7 秒だけでした。そのほとんどはマッチング/交換にあったため、そのような最適化につながることさえありません。

私は通常、言葉の少ない解決策を好みます。結局のところ、より多くのコード = より多くの潜在的なバグです。しかし、この場合、Jon のバージョン (これは実際にはナイーブな実装です (良い意味で)) の方がはるかに優れていることを認めなければなりません。

于 2009-02-11T15:01:03.660 に答える
38

何かのようなもの:

public static String insertPeriodically(
    String text, String insert, int period)
{
    StringBuilder builder = new StringBuilder(
         text.length() + insert.length() * (text.length()/period)+1);

    int index = 0;
    String prefix = "";
    while (index < text.length())
    {
        // Don't put the insert in the very first iteration.
        // This is easier than appending it *after* each substring
        builder.append(prefix);
        prefix = insert;
        builder.append(text.substring(index, 
            Math.min(index + period, text.length())));
        index += period;
    }
    return builder.toString();
}
于 2009-02-11T15:01:37.480 に答える
15

正規表現「..」を使用して各 2 文字を照合し、「$0」に置き換えてスペースを追加できます。

s = s.replaceAll("..", "$0 "); 結果をトリミングして、末尾の余分なスペースを削除することもできます。

または、文字列の末尾にスペースを追加しないように、否定先読みアサーションを追加できます。

s = s.replaceAll("..(?!$)", "$0 ");

例えば:

String s = "23423412342134"; s = s.replaceAll("....", "$0<br>"); System.out.println(s);

出力:2342<br>3412<br>3421<br>34

于 2018-03-01T21:18:20.070 に答える
3

言葉が途切れないように…

試す:

    int wrapLength = 10;
    String wrapString = new String();

    String remainString = "The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog";

    while(remainString.length()>wrapLength){
        int lastIndex = remainString.lastIndexOf(" ", wrapLength);
        wrapString = wrapString.concat(remainString.substring(0, lastIndex));
        wrapString = wrapString.concat("\n");

        remainString = remainString.substring(lastIndex+1, remainString.length());
    }

    System.out.println(wrapString); 
于 2009-05-11T03:28:07.597 に答える
3

サードパーティのライブラリへの依存が気にならず、正規表現も気にしない場合:

import com.google.common.base.Joiner;

/**
 * Splits a string into N pieces separated by a delimiter.
 *
 * @param text The text to split.
 * @param delim The string to inject every N pieces.
 * @param period The number of pieces (N) to split the text.
 * @return The string split into pieces delimited by delim.
 */
public static String split( final String text, final String delim, final int period ) {
    final String[] split = text.split("(?<=\\G.{"+period+"})");
    return Joiner.on(delim).join(split);
}

それで:

split( "This is my string", "<br/>", 5 );  

これはスペースで単語を分割しませんが、前述のように、質問はワードラップを要求しません。

于 2016-06-22T20:22:35.713 に答える
1
StringBuilder buf = new StringBuilder();

for (int i = 0; i < myString.length(); i += 10) {
    buf.append(myString.substring(i, i + 10);
    buf.append("\n");
}

それよりも効率的になることができますが、それは読者の練習問題として残しておきます。

于 2009-02-11T15:04:03.293 に答える
0

N文字ごとに文字列を分割する1つの方法はどうですか?

public static String[] split(String source, int n)
{
    List<String> results = new ArrayList<String>();

    int start = 0;
    int end = 10;

    while(end < source.length)
    {
        results.add(source.substring(start, end);
        start = end;
        end += 10;
    }

    return results.toArray(new String[results.size()]);
}

次に、各ピースの後に何かを挿入する別の方法:

public static String insertAfterN(String source, int n, String toInsert)
{
    StringBuilder result = new StringBuilder();

    for(String piece : split(source, n))
    {
        result.append(piece);
        if(piece.length == n)
            result.append(toInsert);
    }

    return result.toString();
}
于 2009-02-11T15:04:06.993 に答える
0

Kotlin 正規表現のバージョン:

fun main(args: Array<String>) {    
    var original = "this is my string which I need to modify...I love stackoverlow:)"
    println(original)
    val regex = Regex("(.{10})")
    original = regex.replace(original, "$1<br>")
    println(original)
}

コトリンプレイグラウンド

于 2020-05-20T16:37:20.677 に答える