2012-03-14 5 views
1

分割文字列にしよう:私は取り戻すのいずれかようにするためのJava正規表現こんにちは、私は(そのかなり長い)この文字列を分割しようとしていますアップ

Library Catalogue Log off | Borrower record | Course Reading | Collections | A-Z E-Journal list | ILL Request | Help   Browse | Search | Results List | Previous Searches | My e-Shelf | Self-Issue | Feedback       Selected records:  View Selected  |  Save/Mail  |  Create Subset  |  Add to My e-Shelf  |        Whole set:  Select All  |  Deselect  |  Rank  |  Refine  |  Filter   Records 1 - 15 of 101005 (maximum display and sort is 2500 records)         1 Drower, E. S. (Ethel Stefana), Lady, b. 1879. Lady E.S. Drower’s scholarly correspondence : an intrepid English autodidact in Iraq / edited by 2012. BK Book University Library(1/ 0) 2 Kowalski, Robin M. Cyberbullying : bullying in the digital age / Robin M. Kowalski, Susan P. Limber, Patricia W. Ag 2012. BK Book University Library(1/ 0) ... 15 Ambrose, Gavin. Approach and language [electronic resource] / Gavin Ambrose, Nigel Aono-Billson. 2011. BK Book 

1 Drower, E. S. (Ethel Stefana), Lady, b. 1879. Lady E.S. Drower’s scholarly correspondence : an intrepid English autodidact in Iraq/edited by 2012. BK Book University Library(1/ 0) 

// Or 

1 Drower, E. S. (Ethel Stefana), Lady, b. 1879. Lady E.S. Drower’s scholarly correspondence : an intrepid English autodidact in Iraq 

をこれだけです例と1Drower、ES ...は静的ではありません。入力は毎回異なりますが(1と2の間のディテール)、文字列の一般的なレイアウトは常に同じになります。

私が持っている:私はtopでそれを実行すると

String top = ".*   (.*)"; 
String bottom = "\(\d/ \d\)\W*"; 
Pattern p = Pattern.compile(top); //+bottom 
Matcher matcher = p.matcher(td); //td is the input String 
String items = matcher.group(); 
System.out.println(items); 

、ヘッダをすべて削除するためのものが、私は戻って取得すべてがNo match foundです。 bottomは残りの文字列を分割しようとしています。

入力が必要な場合は15まで入力できます。私が必要とするのは、入力文字列を分割して、15個の結果のそれぞれを処理できるようにすることです。

ありがとうございました!

答えて

0

これは両方の入力を提供します。それはあなたが望んだことですか?あなたは結果データからヘッダを分離する必要が

String text = "Library Catalogue Log off ..."; \\truncated text 

Pattern p = Pattern.compile("((1 Drower.+Iraq).+0\\)).+2 Kowalski"); 
Matcher m = p.matcher(text); 
if (m.find()) { 
    System.out.println(m.group(1)); 
    System.out.println(m.group(2)); 
} 

Compile and run code here.

+0

ところであります。しかし、入力は静的ではなく、検索結果に応じて変化します。申し訳ありませんが、私はそれを言及すべきでした。ただし、入力文字列のレイアウトは変更されません。番号1は最初の検索結果であり、最大15件の検索結果が表示されます。私は必要な場合は15までのすべての入力を掲載することができます。 – Tbuermann

+0

私は理解したようにすべての検索結果を分割する必要がありますか? – JMelnik

+0

はい、正しいです。例えば:[1 Drower、E. S. ..]は1つの文字列で、[2 Kowalski、Robin M. ..] [15 Ambrose、Gavin]までです。 ..]は次の文字列でなければなりません。この入力は、検索の結果によって変わります。しかし、入力文字列のレイアウトは常に同じです。だから1、2、3 .. 15未満の結果がなければ常にそこにいる – Tbuermann

0

まず第一に。ブロックが9つあるたびに、これを使用できると仮定します。.*\s{9}(.*)

次に、データを行に解析する必要があります。行の区切り文字がないため、これはより困難です。行が区切られていると仮定することができます。空白と1つ以上の数字、そして別のスペース。

((?<=(?:^|\s))\d+\s.*?(?=(?:$|\s\d+\s)))

あなたは区切り文字を変更することができない限り、気にしないフィールドにレコードを解析しようとすることを計画している場合は!

各ビットが何をするかの少し説明:背後

(?<=(?:^|\s))ルック:(すべての他のレコード)のグループの前の文字が文字列(第一の記録)の開始、またはスペースのいずれかであることを確認してください。

\d+\s.*?キャプチャグループ:1つ以上の数字の後にスペースが続き、次にテキストが続きます。これは、アサーションに非キャプチャグループ?:を使用したために出力に現れる唯一の式の一部です。

(?=(?:$|\s\d+\s))先見:グループを次の文字が文字列マーカー$の終了またはスペースが続く1+数字が続くスペース、のいずれかであることを確認します(次のレコードを示します)。

このメソッドは、指定したフィールドで動作しますが、カスタム区切り文字を含むレコードがある場合は破損します。 「私の10のお気に入りのもの」という本。他の方法では、少し安全なレコードを解析することができますが、それがあなたがしたいことであれば、正規表現の期待を超えています。

関連する問題