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

MyMemoWiki

「SJC-P ストリーム解析(Scanner)」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
(ページの作成:「==SJC-P ストリーム解析(Scanner)== *デフォルトのデリミタは空白文字、変更にはuseDelimiter()を使用する(1) *hasXXX()は次のトークンが…」)
 
 
7行目: 7行目:
  
 
=====使用例=====
 
=====使用例=====
  import java.io.StringReader;
+
  import java.io.String[[R]]eader;
 
  import java.util.Scanner;
 
  import java.util.Scanner;
 
  import java.util.regex.Pattern;
 
  import java.util.regex.Pattern;
 
   
 
   
  public class RegexTest2 {
+
  public class [[R]]egexTest2 {
 
     public static void main(String[] args) {
 
     public static void main(String[] args) {
         RegexTest2 me = new RegexTest2();
+
         [[R]]egexTest2 me = new [[R]]egexTest2();
 
         me.testScanner();
 
         me.testScanner();
 
     }
 
     }
26行目: 26行目:
 
         fs[1] = this.new MailAddrScanner();
 
         fs[1] = this.new MailAddrScanner();
 
         for (AbstractFieldScanner sc : fs) {
 
         for (AbstractFieldScanner sc : fs) {
             sc.scan(new StringReader(buf.toString()));
+
             sc.scan(new String[[R]]eader(buf.toString()));
 
         }
 
         }
 
     }
 
     }
 
     private abstract class AbstractFieldScanner {
 
     private abstract class AbstractFieldScanner {
 
         public abstract Pattern getFiledPattern();
 
         public abstract Pattern getFiledPattern();
         public void scan(Readable source) {
+
         public void scan([[R]]eadable source) {
 
             Scanner scan = new Scanner(source);
 
             Scanner scan = new Scanner(source);
 
             scan.useDelimiter(",");      // デフォルトのデリミタを変更(1)
 
             scan.useDelimiter(",");      // デフォルトのデリミタを変更(1)

2020年2月16日 (日) 04:31時点における最新版

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

  • デフォルトのデリミタは空白文字、変更にはuseDelimiter()を使用する(1)
  • hasXXX()は次のトークンが、XXXとして有効かどうかを判定するhasNext(Pattern) も同様。なので、hasXXX() と nextXXX() を、以下のような使い方で、全トークンを処理することはできない。(2)
while (s.hasNextInt()) { // 予想に反して全件処理されない
  s.nextInt();
}
使用例
import java.io.StringReader;
import java.util.Scanner;
import java.util.regex.Pattern;

public class RegexTest2 {
    public static void main(String[] args) {
        RegexTest2 me = new RegexTest2();
        me.testScanner();
    }
    public void testScanner(){
        StringBuilder buf = new StringBuilder();
        buf.append("山田 太郎,052-123-4567,taro@xxx.co.jp,1\n");
        buf.append("鈴木 一郎,090-3211-2345,ichiro@xxx-yyy.ne.jp,2\n");
        buf.append("佐藤 花子,080-1111-2222,,3\n");
        
        AbstractFieldScanner[] fs = new AbstractFieldScanner[2];
        fs[0] = this.new TelNumScanner();
        fs[1] = this.new MailAddrScanner();
        for (AbstractFieldScanner sc : fs) {
            sc.scan(new StringReader(buf.toString()));
        }
    }
    private abstract class AbstractFieldScanner {
        public abstract Pattern getFiledPattern();
        public void scan(Readable source) {
            Scanner scan = new Scanner(source);
            scan.useDelimiter(",");      // デフォルトのデリミタを変更(1)
            Pattern ptn = getFiledPattern(); 
            
            while (scan.hasNext()) {     // 全トークンを処理(2)
                if (scan.hasNext(ptn)) { // 次のトークンが、パターンに一致するか判定
                    System.out.println(scan.next(ptn));
                } else {
                    scan.next();
                }
            }
        }
    }
    private class TelNumScanner extends AbstractFieldScanner {
        public Pattern getFiledPattern() {
            return Pattern.compile("\\d+[-]\\d+[-]\\d+");
        }
    }
    private class MailAddrScanner extends AbstractFieldScanner {
        public Pattern getFiledPattern() {
            return Pattern.compile(".+[@].+[.].+");
        }
    }
}