1

入力テキストの行から特定のものを一致させる必要があります。行は次のようになります。

 to be/ Σ _ Σ  [1pos, 1neg] {0=1, 2=1}

Scanner クラスを使用してテキストの各行を読み取り、次のコードを記述しました。ただし、「to」のパターンが行に対して一致していないため、何かが正しく機能していません。行に「to」が含まれているため、そのはずです(行から「to」だけでなく一致させようとしましたが、しかし、何も一致しません):

 Scanner scanner = new Scanner(file);
 while(scanner.hasNext()) {
      String line = scanner.nextLine();
      System.out.println("line: " + line);
      Pattern p_pos = Pattern.compile("to");
      Matcher m_pos = p_pos.matcher(line);
      String match = m_pos.group(0);
      System.out.println("match: " + match);
      boolean b_pos = m_pos.matches();
      if(b_pos) {
          System.out.println(match);
      }
 }

出力:

line:    to be/ Σ _ Σ  [1pos, 1neg] {0=1, 2=1}
Exception in thread "main" java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Matcher.java:485)
    at lady.PhrasesFromFile.readFile(PhrasesFromFile.java:31)
    at lady.PhrasesFromFile.main(PhrasesFromFile.java:17)

もう 1 つ質問があります。行の先頭から最初の "/" 記号まですべてを保存するように行を処理するにはどうすればよいですか? APIでそのためのメソッドが見つかりませんでした。そうすることは可能ですか?私は基本的に、連続して行を通過し、行の一部をさまざまな変数に格納してから、これらの変数の値を使用したいと考えています。最初の「/」記号の前にいくつのトークンがあるかわからないため、next() を特定の回数使用することはできません。

前もって感謝します。

4

2 に答える 2

1

次を使用して、トークンに必要な部分を抽出できます。

String tokenSection = Pattern.compile("(to\\s+.*?)/").matcher(line).find().group(1);

次に、それをループして、を使用してトークンを抽出します

Pattern.compile("\\w+").matcher(tokenSection).find();

明らかに、上記のコードを直接プラグインすることはありません。

于 2009-08-03T23:24:03.583 に答える
1

.matches()入力文字列全体との一致を試みます。.find()入力文字列の一部と一致させたい場合、または入力文字列.lookingAt()の先頭と一致させたい場合に使用します。

http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Matcher.html

また、一致するグループを含めるようにパターンを拡張する場合 (一致するグループの動作の詳細については、一般的な正規表現のリファレンスを参照してください)、一致が.group()成功した後に関数を使用して、パターン内の特定のグループに一致する部分文字列を取得できます。

于 2009-08-03T22:57:19.270 に答える