演習の解答

第二回

演習 2-1

  1. dir a*.*
  2. dir *.exe
  3. dir *d.*

演習 2-2

実験については、乱数を使用しているので、出力される個数にはばらつきが ある。 大きく違わない限りは、正答である。

  1. ^a.*を入力する。実験で13個出た。
  2. aを入力する。実験で52個出た。
  3. ^[a-zA-Z][a-zA-Z0-9]*$を入力する。実験で100個出た。

演習 2-3

1. a*
0個以上のaだけの文字列
2. [abc]
a または b または c
3. <[^>]*>
HTML などのタグの表現
4. [1-9][0-9]*
自然数

演習 2-4

部分的にマッチするのを期待して書く方 法と、その他の文字を明示的に書く方法がある。

1. 先頭が a で始まる文字列
^a または ^a.*
2. 最後が b で終る文字列
b$または .*b$
3. c を含む文字列
cまたは.*c.*
4. abc を含む文字列
abc または.*abc.*
5. abc または def を含む文字列
(abc|def) または .*(abc|def).*
6. 先頭が英字または_(アンダースコア)、二文字目以降がある場合英字、 数 字、または_(アンダースコア)である文字列(C 言語では名前はこ のルー ルに従う必要がある)
^[A-Za-z_][A-Za-z0-9_]*または ^[A-Za-z_][A-Za-z0-9_]*$

演習 2-5

1. Java の正規表現で、整数を表しなさい

(\+|-)?(0|[1-9][0-9]*)(+記号は正規表現の演算子なので、バックスラッシュでエスケープする)

2. 次の文字列中の整数を列挙するプログラムを作りなさい

String input="-10+30-20";

import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Ex252 {
	public static void main(String[] args) {
		Pattern p = Pattern.compile( "(\\+|-)?(0|[1-9][0-9]*)");
		String input="-10+30-20";
		Matcher m = p.matcher(input);
		while(m.find()) {
			System.out.println(m.group());
		}
	}
}

文字列中の正規表現のエスケープのためのバックスラッシュに関しては、 更にバックスラッシュを重ねてエスケープする必要がある。

3. input 文字列に含まれている整数の数を表示するプログラムを作りなさい


import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Ex253 {
	public static void main(String[] args) {
		Pattern p = Pattern.compile( "(\\+|-)?(0|[1-9][0-9]*)");
		String input="-10+30-20";
		Matcher m = p.matcher(input);
		int n=0;
		while(m.find()) {
			n++;		
		}
		System.out.println(n);
	}
}

演習 2-6

第三回

演習 3-1

受理パターン

package ex31;
import java.io.*;
enum State {
	STATE1, STATE2
}
class Ex31 {
	private static int get(Reader r) throws IOException {
		int c;
		do{
			c=r.read();
		}while(c=='\n' || c=='\r');
		return c;
	}
	public static void main(String[] arg)throws IOException{
		final Reader r = new InputStreamReader(System.in);
		int c;
		State s=State.STATE1;
		try{
			while((c=get(r))!=-1){
				switch(s){
				case STATE1:
					if(c>='1' && c<='9'){ s=State.STATE2; }
					else{ throw new IllegalStateException(); }
					break;
				case STATE2:
					if(c>='0' && c<='9'){ s=State.STATE2; }

					else{ throw new IllegalStateException(); }
					break;
				}
			}
			if(s!=State.STATE2){
				throw new IllegalStateException();
			}
			System.out.println("Accept");
		}catch(IllegalStateException e){
			System.out.println("Reject");
		}
	}
}    

演習 3-2

  1. 状態リスト 入力 遷移先の状態リスト
    1 a 1,2
    b 1
    1,2 a 1,2
    b 1,3
    1,3 a 1,2
    b 1,4
    1,4 a 1,2
    b 1
    
    package ex321;
    
    import java.io.*;
    enum State {
    	S1, S12, S13, S14
    }
    class Ex321 {
    	private static int get(Reader r) throws IOException {
    		int c;
    		do{
    			c=r.read();
    		}while(c=='\n' || c=='\r');
    		return c;
    	}
    	public static void main(String[] arg)throws IOException{
    		final Reader r = new InputStreamReader(System.in);
    		int c;
    		int count=0;
    		State s=State.S1;
    		while((c=get(r))!=-1){
    			switch(s){
    			case S1:
    				if(c=='a'){ s=State.S12; }
    				else if(c=='b'){ s=State.S1; }
    				break;
    			case S12:
    				if(c=='a'){ s=State.S12; }
    				else if(c=='b'){ s=State.S13; }
    				break;
    			case S13:
    				if(c=='a'){ s=State.S12; }
    				else if(c=='b'){ s=State.S14; }
    				break;
    			case S14:
    				count ++;
    				if(c=='a'){ s=State.S12; }
    				else if(c=='b'){ s=State.S1; }
    				break;
    			}
    		}
    		if(s==State.S14){
    			count ++;
    		}
    		System.out.println(count);
    	}
    }
    

演習 3-1

演習 3-1

演習 3-1

演習 3-1

演習 3-1

演習 3-1


坂本直志 <[email protected]>
東京電機大学工学部情報通信工学科