「SJC-P ストリーム解析(Scanner)」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「==SJC-P ストリーム解析(Scanner)== *デフォルトのデリミタは空白文字、変更にはuseDelimiter()を使用する(1) *hasXXX()は次のトークンが…」) |
|||
7行目: | 7行目: | ||
=====使用例===== | =====使用例===== | ||
− | import java.io. | + | 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 | + | public class [[R]]egexTest2 { |
public static void main(String[] args) { | public static void main(String[] args) { | ||
− | + | [[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 | + | 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( | + | 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(".+[@].+[.].+"); } } }
© 2006 矢木浩人