2016-05-04 15 views
6

現在、文字列を複数行の文字列にスプライスしようとしています。 正規表現は、前に13文字の空白を選択する必要があります。空白文字列を分割する

問題は、前の選択された空白の後に13文字カウントがリセットされないことです。したがって、最初の13文字の後に、正規表現はすべての空白を選択します。

私はpositive look-behind 13の文字と、次の正規表現を使用しています:

(?<=.{13}) 

(末尾の空白がある)

あなたが正規表現here、次のコードをテストすることができます。

import java.util.ArrayList; 
public class HelloWorld{ 

    public static void main(String []args){ 
     String str = "This is a test. The app should break this string in substring on whitespaces after 13 characters"; 

     for (String string : str.split("(?<=.{13}) ")) { 
      System.out.println(string); 
     } 
    } 
} 

次のように、このコードの出力である:

これはテストです。

アプリ



13後の文字

サブ

上の空白で
ブレーク
この
文字列
べき

ただし、次のようになります。

これはテストです。
13後
空白の部分文字列で
アプリがなければならない
ブレークこの文字列
文字

答えて

5

あなたが実際に試合ラインに怠惰な制限数量詞を使用して、$0\nで置き換えることがあります。

.{13,}?[ ] 

regex demo

IDEONE demo:パターンが一致していることを

String str = "This is a test. The app should break this string in substring on whitespaces after 13 characters"; 
System.out.println(str.replaceAll(".{13,}?[ ]", "$0\n")); 

注:

  • .{13,}? - あなたは任意の文字に一致させる必要がある場合、私は疑うものの、DOTALL修飾子を使用します(改行はなく、任意の文字現在のシナリオではそれを必要とする)、少なくとも13回、出現した最初のスペースまで、より多くの文字を一致させることができます
  • [ ] - リテラルスペース(文字クラスi冗長ですが、パターンを視覚化するのに役立ちます)。

置換パターン("$0\n")は、マッチした値(グループ0に格納されている)全体を再挿入し、後に改行を追加します。

+0

ありがとう。私は文字列を一致させることを考えず、このようなマッチンググループを使用しました。私はそれらを選択したいときに常にマッチングするグループと闘う。あなたの答えをあまりにも早く読むので、前のコメントを削除しました。 – Seblor

+0

さて、あなたは、一致パターン全体が置換パターンで '$ 0 'で逆参照できるとは思わないと思います。 –

+0

正確です。私は通常、正規表現をメールアドレス、数字などにマッチさせるためにのみ使用します(Javaではありません)。 – Seblor

3

分割するのではなく、空白の前に13文字を一致させてキャプチャすることができます。

Javaコードは:

Pattern p = Pattern.compile("(.{13}) +"); 
Matcher m = p.matcher(text); 

List<String> matches = new ArrayList<>(); 
while(m.find()) { 
    matches.add(m.group(1)); 
} 

これは、生成されます:あなたは.splitや正規表現を使用してこれを行うことができます

This is a test. 
The app should 
break this string 
in substring on 
whitespaces after 
13 characters 

RegEx Demo

+0

お返事ありがとうございますが、Wiktorの答えは短く、パターンやMatcherオブジェクトは必要ありません。とにかく 'Matcher.group()'メソッドを私に見せてもらってください。 – Seblor

+0

'split'の戻り値は' \ n'の文字列ではない文字列配列です。配列を取得するために、これにはさらに多くのコードが必要です。元の文字列にすでに '\ n'が入っていて、元の' \ n'がどこにあり、どこに新しく挿入されたものがあるのか​​分かりますか? – anubhava

0

。このようになります

line.split("\\s+"); 

これは、すべての単語に1つ以上の空白が含まれます。

+1

私はあなたがその質問を再度読む必要があると思います。 (そして私はすでに答えを得ている) – Seblor

関連する問題