Javaのスキャナーを使用した、行内の一致トークンの問題
-
22-07-2019 - |
質問
入力テキストの行から特定のものを照合する必要があります。行は次のようになります。
to be/ Σ _ Σ [1pos, 1neg] {0=1, 2=1}
テキストの各行を読み取るためにScannerクラスを使用しており、次のコードを記述しました。ただし、パターンが「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()を特定の回数使用することはできません。
よろしくお願いします。
解決
.matches()
は、全体入力文字列の照合を試みます。入力文字列の一部に一致させる場合は .find()
を使用し、入力文字列の先頭に一致させる場合は .lookingAt()
を使用します。
http:// java .sun.com / j2se / 1.4.2 / docs / api / java / util / regex / Matcher.html
また、パターンを拡張して一致するグループを含める場合(一致するグループの機能の詳細については、一般的な正規表現リファレンスを参照)、一致が成功した後に .group()
関数を使用できますパターン内の特定のグループに一致する部分文字列を取得します。
他のヒント
次を使用して、トークンに必要な部分を抽出できます:
String tokenSection = Pattern.compile("(to\\s+.*?)/").matcher(line).find().group(1);
そしてそれをループしてトークンを抽出します
Pattern.compile("\\w+").matcher(tokenSection).find();
明らかに、上記のコードを直接プラグインすることはありません。