2016-10-21 6 views
-1

私は、ファイルから入力を読み込んで単語から文章を作成するプログラムを作成しています。私は単語がある文章ターミネーターのいずれかで終わるかどうかをチェックするために、各単語を検査しています:(。)文字列処理正規表現

  • 期間
  • 感嘆符
  • と疑問符
(!)(?)

私は文オブジェクトの新しいインスタンスを作成する必要があるかどうかを決定します。 これは私がこれまで

ArrayList<Sentence2> sentences = new ArrayList<>(); 
String wordsJoin = ""; 
int numOfWords = 0; 
try{ 
    input = new BufferedReader(new FileReader("final.txt")); 
    strLine = input.readLine(); 
    while(strLine != null){ 
     String[] tokens = strLine.split("\\s+"); 
     for (int i = 0; i < tokens.length; i++){ 
      String s = tokens[i]; 
      if(s.charAt(s.length()-1) != '.' ||s.charAt(s.length()-1) !='?' ||s.charAt(s.length()-1) != '!'){ 
       wordsJoin += tokens[i] + " "; 
       numOfWords += tokens.length; 
      }else{ 
       sentences.add(new Sentence2(wordsJoin,numOfWords)); 


      } 
     } 
     strLine = input.readLine(); 
    } 

問題がある、私は限界例外のうち、取得しています思い付いたものです。スタックトレースはここにある:範囲外の文字列インデックス:-1 java.lang.String.charAtで(String.java:658)

!スレッド "メイン" java.lang.StringIndexOutOfBoundsExceptionで

例外

私のプログラムは入力を読み込んでいて、単語の最後の文字が文末に終わるかどうかを判断します。文と単語の数からなる文クラスのインスタンスを作成しますその文に含まれる。

私はプロセスに必要なファイルからテキストの一部はここにある:暗号のウィキペディアのページに基づいている以下の

テキスト! 暗号は、情報を隠すことの実践と研究です。現代では、暗号は数学とコンピュータサイエンスの両方であり、情報理論、コンピュータセキュリティ、エンジニアリングに密接に関係しています。暗号は、技術的に先進的な社会に存在するアプリケーションで使用されます。例としては、暗号化に依存するATMカード、コンピュータパスワード、および電子商取引のセキュリティが挙げられます。

私は本当にこれで助けが必要です、私は今かなりの時間からそれを超えてきました。

+0

この質問は、配列インデックスの範囲外の例外とどのように重複していますか。私はregexを使って文字列を処理していますが、もう一つは文字列です。 @JarrodRoberson – Saad

答えて

1

あなたの正規表現は間違っています。文字列を分割してすべての単語を取得するには、split("\\s+")を使用する必要があります。

public class Main { 
    public static void main(String... args) { 
     ArrayList<Sentence2> sentences = new ArrayList<>(); 
     String wordsJoin = ""; 
     int numOfWords = 0; 

     String strLine = "It will be splitted? Sentence by sentence? Sure!"; 

     String[] tokens = strLine.split("\\s+"); 
     for (int i = 0; i < tokens.length; i++) { 
      if(strLine.isEmpty()){ 
       continue; 
      } 

      String s = tokens[i]; 
      wordsJoin += tokens[i] + " "; 
      numOfWords += tokens.length; 

      if (s.charAt(s.length() - 1) == '.' || s.charAt(s.length() - 1) == '?' || s.charAt(s.length() - 1) == '!') { 
       sentences.add(new Sentence2(wordsJoin, numOfWords)); 
       wordsJoin = ""; 
       numOfWords = 0; 
      } 
     } 

     for (Sentence2 sentence2 : sentences) { 
      System.out.println(sentence2.wordsJoin + " " + sentence2.numOfWords); 
     } 
    } 

    public static class Sentence2 { 
     private String wordsJoin; 
     private int numOfWords; 

     public Sentence2(String wordsJoin, int numOfWords) { 
      this.wordsJoin = wordsJoin; 
      this.numOfWords = numOfWords; 
     } 
    } 
} 
+0

私の元のプログラムで間違いを犯しているかもしれませんが、それはあなたのようなものです。 – Saad

+0

しかし、それはすべての最後のキャラクターがなければならないことを意味しません!その声明が真実であるためには? – Saad

+0

ちょうどそれが行く方法を見たいと思って、ちょうど追加され、それはまだ同じエラーを示しています。 – Saad

0

split()から返されるトークンの長さを常にチェックします。空文字列にすることもできますが、token.charAt(token.length()-1)は存在しません。

また、文字列が空の文字列の前にcharAt()メソッドにそれを置く含まれていないかどうかをチェックすることを確認してくださいHow exactly does String.split() method in Java work when regex is provided?

0

を見てみましょう。折りたたみのようなもの:

int len = s.length(); 
char = len > 0 ? s.charAt(len) : '';