| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

SJC-P ストリーム解析(Scanner)

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

SJC-P ストリーム解析(Scanner)

  • デフォルトのデリミタは空白文字、変更にはuseDelimiter()を使用する(1)
  • hasXXX()は次のトークンが、XXXとして有効かどうかを判定するhasNext(Pattern) も同様。なので、hasXXX() と nextXXX() を、以下のような使い方で、全トークンを処理することはできない。(2)
  1. while (s.hasNextInt()) { // 予想に反して全件処理されない
  2. s.nextInt();
  3. }
使用例
  1. import java.io.StringReader;
  2. import java.util.Scanner;
  3. import java.util.regex.Pattern;
  4.  
  5. public class RegexTest2 {
  6. public static void main(String[] args) {
  7. RegexTest2 me = new RegexTest2();
  8. me.testScanner();
  9. }
  10. public void testScanner(){
  11. StringBuilder buf = new StringBuilder();
  12. buf.append("山田 太郎,052-123-4567,taro@xxx.co.jp,1\n");
  13. buf.append("鈴木 一郎,090-3211-2345,ichiro@xxx-yyy.ne.jp,2\n");
  14. buf.append("佐藤 花子,080-1111-2222,,3\n");
  15. AbstractFieldScanner[] fs = new AbstractFieldScanner[2];
  16. fs[0] = this.new TelNumScanner();
  17. fs[1] = this.new MailAddrScanner();
  18. for (AbstractFieldScanner sc : fs) {
  19. sc.scan(new StringReader(buf.toString()));
  20. }
  21. }
  22. private abstract class AbstractFieldScanner {
  23. public abstract Pattern getFiledPattern();
  24. public void scan(Readable source) {
  25. Scanner scan = new Scanner(source);
  26. scan.useDelimiter(","); // デフォルトのデリミタを変更(1)
  27. Pattern ptn = getFiledPattern();
  28. while (scan.hasNext()) { // 全トークンを処理(2)
  29. if (scan.hasNext(ptn)) { // 次のトークンが、パターンに一致するか判定
  30. System.out.println(scan.next(ptn));
  31. } else {
  32. scan.next();
  33. }
  34. }
  35. }
  36. }
  37. private class TelNumScanner extends AbstractFieldScanner {
  38. public Pattern getFiledPattern() {
  39. return Pattern.compile("\\d+[-]\\d+[-]\\d+");
  40. }
  41. }
  42. private class MailAddrScanner extends AbstractFieldScanner {
  43. public Pattern getFiledPattern() {
  44. return Pattern.compile(".+[@].+[.].+");
  45. }
  46. }
  47. }