Skip to content

Instantly share code, notes, and snippets.

@Kuniwak
Last active August 17, 2017 09:45
Show Gist options
  • Save Kuniwak/36e3f793fe1331968894f5fb135affb6 to your computer and use it in GitHub Desktop.
Save Kuniwak/36e3f793fe1331968894f5fb135affb6 to your computer and use it in GitHub Desktop.

課題3

改行区切りの email アドレスのリストが標準入力経由で渡されます。 この email アドレスがページ末にある仕様として正当なものであれば ok を、そうでなければ ng を改行区切りのリストとして標準出力へ書き込むプログラム validate_addr_spec を実装してください。

なお、既存のメールアドレス判定関数は使わずに、自前で書いてください!

入力の例

$ cat email_address.list
abc@example.com
a..bc@example.com

期待する出力

$ ./validate_addr_spec < email_address.list
ok
ng

採点の受け方

採点を受けたい場合は、入力データを渡すので下のコマンドの実行結果を @kuniwak まで送ってください!

$ ./validate_addr_spec < email_address.list > result

この課題でのメールアドレスの仕様

メールアドレスは、 ローカル部 @ ドメイン部 という3つのパーツから構成されます。 それぞれ、次のすべての仕様を満たさなければなりません:

  • ドメイン部: example.com などのドメインを表す部分
    • 仕様D1: ドメイン部に使ってよい文字は、大小英数文字と一部の記号 !#$%&'*+-/=?^_`{|}~. だけである
    • 仕様D2: ドメイン部は . で始まらない
    • 仕様D3: ドメイン部は . で終わらない
    • 仕様D4: ドメイン部に連続した . は現れない
    • 仕様D5: ドメイン部の文字列長は1以上である
  • @:
    • 仕様A1: ローカル部とドメイン部の間にはただ1つの @ がなければならない
  • ローカル部: user などのメールボックス名を表す部分
    • 仕様L1: ローカル部は、ドットアトム部またはクオーテッド文字列部のどちらかである
    • ドットアトム部:
      • 仕様LD1: ドットアトム部で使える文字は、大小英数文字と一部の記号 !#$%&'*+-/=?^_`{|}~. だけである
      • 仕様LD2: ドットアトム部は . で始まらない
      • 仕様LD3: ドットアトム部は . で終わらない
      • 仕様LD4: ドットアトム部に連続した . は現れない
      • 仕様LD5: ドットアトム部の文字列長は1以上である
    • クオーテッド文字列部:
      • 仕様LQ1: クオーテッド文字列部は " で始まる
      • 仕様LQ2: クオーテッド文字列部は " で終わる
      • 仕様LQ3: クオーテッド文字列部の先頭と末尾以外で使える文字は、大小英数文字と一部の記号 !#$%&'*+-/=?^_`{|}~(),.:;<>@[]"\ だけである
      • 仕様LQ4: クオーテッド文字列部の先頭と末尾以外で一部の記号 "\ を使う場合、ただ1つ \ を前置しなければならない
      • 仕様LQ5: クオーテッド文字列部の文字列長は2以上である

※ これは RFC5312 addr-spec の部分的な仕様です(なぜなら、実際の仕様を満たす実装はとても難しい)。

※ 「大小英数文字」とは、ASCII 文字集合のうち、16進表記で 30 から 39、41 から 5A、61 から 7Aに含まれる文字の集合を指す。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment