2011-02-05 11 views
4

テキストの行には「*(,identifier1*(identifier2」があり、単語の文字([a-zA-Z_0-9])として定義されている識別子を読みたいと思います。java.util.Scannerで次の文字列識別子を取得するためにどのようなパターンを使用する必要がありますか?

どちらのパターンを使用しますか?私が使用して考える:

scanner.next("[\\w]+"); 

が、私はjava.util.InputMismatchException

+0

文字は次のように使用されているもの:

import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { List<String> words = extractWords("*(,identifier1*(identifier2"); for (String word : words) System.out.println(word); } public static List<String> extractWords(String input) { List<String> out = new ArrayList<String>(); Pattern re = Pattern.compile("\\w+"); Matcher matcher = re.matcher(input); while (matcher.find()) out.add(matcher.group()); return out; } } 

出力を生成しますテキストソースのデリミタ? InputMismatchExceptionは、ScannerがトークンをStringに一致させることができないことを示しています。 –

+0

区切り文字は、文字、数字またはアンダースコアではないものです。また、区切り文字は複数の文字幅にすることができます。 –

+1

@James、それは有効な正規表現パターンです。 –

答えて

5

スキャナのデフォルトの区切り文字は空白である例外を取得していますので、あなたのスキャナオブジェクトの最初の(そして唯一の)トークンが文字列全体"*(,identifier1*(identifier2"です。その文字列は、next("[\\w]+")を呼び出して取得しようとしています。これは、入力と一致しないために例外がスローされます。あなたは後にしている何

はよりfindInLine("\\w+")のようなものです:

生成
Scanner scan = new Scanner("*(,identifier1*(identifier2"); 
System.out.println(scan.findInLine("\\w+")); 
System.out.println(scan.findInLine("\\w+")); 

identifier1 
identifier2 

それとも、一つ以上の非(アスキー)アルファにご入力文字列を分割したい場合に-num-chars(および_)、試してみてください:

Scanner scan = new Scanner("*(,identifier1*(identifier2").useDelimiter("\\W+"); 
while(scan.hasNext()) { 
    System.out.println(scan.next()); 
} 

前と同じように置く。等しい私は資本Wを使用

注:

\W == [^\w] == [^a-zA-Z0-9_] 
+0

あなたのソリューション 'findInLine'が機能します。 'Scanner.next(regex)'は読み込みに失敗したときに例外をスローするようです(!?) –

+2

@John、はい、ストリームの次のトークンがあなたの提供されたパターンと一致しない場合は例外をスローします。 'scanner.next(" [\\ w] + ");'を 'scanner.next("。+ ");'に変更すると、最初のトークンが正しく入力されます(これは入力文字列全体と同じです)。 –

+0

区切り文字として '\ W'を使用する場合は+1。 @ジョン:バートのコードで例外を取得していますか? –

1

をあなたがスキャナを使用する必要があり、いくつかの理由がない限りは、あなたが好きなところから文字列を取得し、直接言葉を抽出することもできます。もちろん、これはスキャナで、彼らは一度に一つで読んだのに対し、一度にメモリにすべての単語をロードします。

identifier1 
identifier2 
+0

大きなファイルを読んでいるので、これはオプションではありません。しかし、あなたのソリューションは面白いです。 +1。 –

関連する問題