3

現在、文字列をスペースで分割しています。ただし、それらをすべて元に戻すときに保持したい二重のスペースがいくつかあります。これを行う方法に関する提案はありますか?

つまり、文字列"I went to the beach. I ate pie"は次のように分割されています

I
went
to
the
beach.

I
ate
pie

空白のエントリは必要ありませんが、同じ形式にまとめたいと考えています。皆さんありがとう!

4

5 に答える 5

3

String replaceAll(" ", "likerCharacterSequence") を実行してから、通常どおり文字列をスペースで分割します。次に、末尾の {unlikelyCharacterSequence} を " " に置き換えることで、ダブル スペースに戻すことができます。

ただし、実際の変更されていない文字列で「ありそうもない」文字シーケンスに遭遇した場合、これは失敗します。より汎用的なソリューションについては、この例の下にリストされている代替案を確認してください。

例 (警告、 !@#!@# が存在しないことに依存します:

String example = "Hello.  That was a double space. That was a single space."
String formatted = example.replace("  ", " !@#!@#");
String [] split = formatted.split(" ");
for(int i = 0; i < split.length; i++)
{
  split.replace("!@#!@#", " ");
}
// Recombine your splits?

または、質問にあるように文字列を再結合するより堅牢な戦略を採用できますが、単一のスペースのみを含む要素は無視します。

String example = "ThisShouldBeTwoElements.  ButItIsNot.";
String [] splitString = example.split(" ");
String recombined = "";
for(int i = 0; i < splitString.length; i++)
{
  if(!splitString[i].equals(" "))
    recombined += splitString[i];
}
于 2012-07-03T18:22:00.920 に答える
2
String st = "I went to the beach.  I ate pie";
st.split("\\s{1}(?!\\s)");

これにより、

[I, went, to, the, beach. , I, ate, pie]

http://docs.oracle.com/javase/6/docs/api/および/またはhttp://www.regular-expressions.info/java.htmlを参照して、これが何をしているのかを理解することもお勧めします。

于 2012-07-03T18:50:42.250 に答える
1

これを試してみてください。空白以外の文字の間にあるすべての空白を削除する必要があります。

myString = myString.replaceAll("\S\s\S", "");

これにより、空白が 2 つの単語の間に複数回出現する場合に空白が保持されます。

于 2012-07-03T18:30:32.773 に答える
1

これは古い質問であることは承知していますが、将来の聴衆のために: あなたが探している概念は「グループのキャプチャ」です。グループをキャプチャすると、文字列が飲み込まれる代わりに、後方参照などを介して、式で一致を参照し、後でそれらを取得できます。

ドキュメントから、知っておく必要がある関連する構文は次のとおりです。

(?<name>X)          X, as a named-capturing group
(?:X)               X, as a non-capturing group
(?idmsuxU-idmsuxU)  Nothing, but turns match flags i d m s u x U on - off
(?idmsux-idmsux:X)  X, as a non-capturing group with the given flags i d m s u x on - off
(?=X)               X, via zero-width positive lookahead
(?!X)               X, via zero-width negative lookahead
(?<=X)              X, via zero-width positive lookbehind
(?<!X)              X, via zero-width negative lookbehind
(?>X)               X, as an independent, non-capturing group

入力テキストの使用:

String example = "ABC     DEF     GHI J K";

肯定的および否定的な先読みの組み合わせを使用して、末尾の空白を各単語と組み合わせることができます。

// Result: [ABC     , DEF     , GHI , J , K]
example.split("(?<=\\s+)(?!\\s)");

または、肯定的な先読みで単語境界をキャプチャして、スペースを個別のグループ化された要素として保持できます。

// Result: [ABC,      , DEF,      , GHI,  , J,  , K]
example.split("(?=\\b)");

Java パターン API:
http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html



補足:「テキストをまったく信じがたいものに置き換える」という提案は簡単なので魅力的ですが、本番コードでは絶対に行わないでください。最終的に失敗し、思ったよりも頻繁に発生します。プログラマーが約 80 列の "~=$~=$~=$..." を安全だと信じて使用した後、私はコール センターをデバッグしました。サービス担当者がそのシーケンスだけでメモに「派手な境界線」を保存するまで、それは数か月続きました。私は、検索サーバーで本物のランダムな MD5 衝突を目撃したことさえあります。確かに、MD5 の衝突には 11 年かかりましたが、それでも検索がクラッシュし、要点は残っています。一意の文字列は決してありません。重複が発生することを常に想定してください。

于 2015-02-26T06:17:28.643 に答える
1

Java の正規表現で何ができるかをよく見てください。正規表現を使用してパターンを認識する方法があります。

Java 正規表現の例

于 2012-07-03T18:21:13.680 に答える