2013-06-13 15 views
9

私はこのことを説明するのがかなり難しいので、私は達成したいことの前/後のいくつかの例を紹介します。入力の分割文字列に "。"

例:

Hello.World

This.Is.A.Test

The.S.W.A.T.Team

S.W.A.T.

s.w.a.t

2001.A.Space.Odyssey

募集出力:

のHello World

これはテスト

SWATチーム

SWATです

SWAT

2001 A宇宙の旅

基本的に

、私はドットで文字列を分割できる何かを作成したいが、同時に略語を処理したいです。

私の略語の定義は、少なくとも2文字(ケーシングに関係なく)と2つのドット、つまり「A.B」を持つものです。または "a.b."。 は、は数字で動作しません(つまり、「1.a.」)。

私は正規表現であらゆる種類のことを試しましたが、それは私の強い訴訟ではありませんので、私が使用できるアイデアやポインターがあれば幸いです。

+5

省略語を決定するロジックは何ですか?言い換えれば、これを決定する現実世界の基準を説明できますか?具体的には、おそらく一文字「A」と「I」の場合が最も大きなケースです。 –

+0

申し訳ありません、それを忘れました。ただ追加されました。 –

+1

私はあなたの定義を見ていますが、本当に行頭の文字 - ドット - レタードット '^ [AZ] \。[AZ] \。'またはドット - レタードット - レタードット ' 。[AZ] \。[AZ] \。 '略語は大文字でなければなりませんか? –

答えて

11

regexで消える必要のあるドットを削除し、残りのドットをスペースで置き換えるのはどうですか?正規表現は(?<=(^|[.])[\\S&&\\D])[.](?=[\\S&&\\D]([.]|$))のように見えます。正規表現で

String[] data = { 
     "Hello.World", 
     "This.Is.A.Test", 
     "The.S.W.A.T.Team", 
     "S.w.a.T.", 
     "S.w.a.T.1", 
     "2001.A.Space.Odyssey" }; 

for (String s : data) { 
    System.out.println(s.replaceAll(
      "(?<=(^|[.])[\\S&&\\D])[.](?=[\\S&&\\D]([.]|$))", "") 
      .replace('.', ' ')); 
} 

結果

Hello World 
This Is A Test 
The SWAT Team 
SwaT 
SwaT 1 
2001 A Space Odyssey 

私は、ドット文字の特殊な意味をエスケープする必要がありました。私は\\.でそれをすることができましたが、私は[.]を好んでいます。

正規表現のcanterにはドットリテラルがあります。今このドットは(?<=...)(?=...)で囲まれています。これらは、ルックアヘッドおよびルックアヘッドと呼ばれるlook-aroundメカニズムの一部です。

  • 除去する必要があるドットはドット(またはデータ^の開始)と私は(?<=(^|[.])[\\S&&\\D])[.]を使用してテストすることができ、その前にも非桁の\ Dの文字であるいくつかの非空白\\Sを持っているので。

  • も除去する必要があることドット[.](?=[\\S&&\\D]([.]|$))


のように書くことができ、それは後に、非空白と非数字文字と他のドット(データ $の必要に応じて端部)を有します

必要に応じて、[email protected]#$%^&*()-_=+...などの文字にも一致する文字の横には、英字のみの場合は[a-zA-Z]、Unicodeの場合は\\p{IsAlphabetic}と置き換えることができます。

+0

これは完璧です!そして私は自分自身で思いつくことができたものにかなり近いです。私の正規表現で作業する必要があります:-)ありがとう! –

+1

正規表現について教えていただけますか? <と=の正確な機能を見つけることができないようです。他人を助けるかもしれません:-) –

+0

ありがとう!私はそれが可能であることをかなり確信していましたが、私はそれが文書化されて見つけることができませんでした。正規表現は素晴らしいです! –

0

すべての単語は大文字で始まるので、最初にすべてのドットを削除し、スペース( "")で置き換えることをお勧めします。次に、すべての文字を繰り返し、小文字とそれに続く大文字の間にスペースを入れます。また、小文字の後に大文字がある場合は、大文字の前にスペースを入れます。

私が提供したすべての例で機能しますが、私の観察に例外があるかどうかはわかりません。

+0

残念ながら、大文字と小文字の両方で動作するはずであることを忘れてしまいました。追加されました。 –

+0

問題ありません。前処理を行います。すべての文字を繰り返し、ドットの後のすべての文字を大文字に変換します。他のすべてを小文字にします。 – darijan