Chapter 10: Exercises

選擇題


簡答題

  1. 請寫一個通用式來進行身份證字號的簡易比對。(假設身份證字號是由一個英文字母加上九個數字所組成。)
  2. 請寫一個通用式來進行信用卡卡號的簡易比對。(假設信用卡卡號的格式是 xxxx-xxxx-xxxx-xxxx,其中每一個 x 都是代表一個數字。)
  3. 給定一個字串變數 x = " 金   城  武 ",請說明如何使用通用式來刪除此字串中的空白(包含全形空白、半形空白、定位鍵等)。
  4. 請說明如何將通用式採用的「貪心比對」改成「最小比對」。
  5. 請說明通用式所採用的「越左越貪」的機制為何?請舉實例來說明。
  6. 請說明下列通用式的涵義:
    1. /^xy/
    2. /xy$/
    3. /[13579]/
    4. /[0-9]/
    5. /[a-z0-9]/
    6. /[a-zA-Z0-9]/
    7. /b[aeiou]t/
    8. /[^0-9]/
    9. /[^aeiouAEIOU]/
    10. /a.b/
    11. /a.*b/
    12. /a.*?b/
    13. /[^\^]/
    14. /^.+@.+\..{2,3}$/

程式題

請盡量使用本章所學到的通用表示法來完成下列作業:
  1. (*) 允許身份證字號第一個字母大小寫均可: 請修改範例 regExpId01.htm,產生新網頁,讓使用者輸入的身份證字號的第一個英文字母不限大寫或小寫。
  2. (*) 對英文姓名進行修正: 請修改範例 regExpEnglishName01.htm,產生新網頁,讓使用者在驗證資料時,程式碼會先對英文名字進行修正:把每個字彙的第一個字母改成大寫,其餘小寫。
  3. (*) 亂數產生身份證字號: 請根據身份證號碼的編碼規則,利用亂數,一次產生五組有效的身份證號碼,範例表單如下:

    習題格式範本(generateIdNumber01.htm):

    請注意:

    • 輸入的英文字母必須是合格的。
    • 必須將英文字母轉成大寫,再加上九位數字。
    • 必須利用亂數產生,所以每次產生的五組號碼都應該不一樣。
  4. (*) 亂數產生信用卡卡號: 請根據信用卡號碼的編碼規則,利用亂數,一次產生五組有效的信用卡號碼,範例表單如下:

    習題格式範本(generateCreditCardNumber01.htm):

  5. (**) 身份證字號驗證: 對使用者輸入的身份證字號進行基本驗證:請你必須設計一個網頁,包含一個文字欄位,能讓使用者輸入個人的身份證字號,並在按下「驗證」鈕後,驗證此輸入資料。若輸入資料滿足身份證字號的編碼規則,則以警告視窗顯示「通過」,否則顯示「不通過」。(身份證字號的第一個字母,可以允許是大寫或小寫。)範例表單如下:

    習題格式範本(regExpId03.htm):

  6. (**) 信用卡卡號驗證: 對使用者輸入的信用卡卡號進行基本驗證:請你必須設計一個網頁,包含一個下拉式選單,可以讓使用者填入信用卡類別(Visa、Master、American Express),以及一個文字欄位,能讓使用者輸入個人的信用卡卡號,並在按下「驗證」鈕後,驗證此輸入資料。若輸入資料滿足信用卡卡號的編碼規則,則以警告視窗顯示「通過」,否則顯示「不通過」。範例表單如下:

    習題格式範本(regExpCreditCardNumber02.htm):

  7. (***) 電子郵件驗證: 更精準的電子郵件通用式:在範例 regExpEmail01.htm 中,我們使用一個簡單的通用式「/^.+@.+\..{2,3}$/」來代表電子郵件的格式。但是事實上,此通用式並不完全精準,請你設計一個網頁 regExpEmail02.htm,使用較複雜的通用式,可以更精準地表示一般電子郵件的格式,網頁格式如下:

    習題格式範本(regExpEmail02.htm):

    請務必說明你的通用式如何能精準地描述電子郵件的格式。

  8. (***) HTTP網址驗證: 請設計一個網頁,能夠精確地描述一個以「http://」開始的個人網址,基本要求如下:
    • 合格網址範例:http://www.cs.nthu.edu.tw/~jang", "http://www.mathworks.com", "http://www.cs.nthu.edu.tw:4500/~jang/publie/index.asp"
    • 不合格網址範例:"www.mathworks.com", "http://www..com"
    網頁格式如下:

    習題格式範本(regExpHttp01.htm):

    請務必說明你的通用式如何能精準地描述 http 的網址格式。

  9. (**) 對表單資料進行修正及驗證: 請用通用表示法來對下列表單資料進行修正及驗證:

    • 英文名字:
      格式需求:最少兩個、最多三個英文字,每個英文字的第一個字母必須改成大寫,其餘小寫,並請去除不必要之空白。

    • 中文名字:
      格式需求:最少兩個、最多四個中文字,並請去除不必要之空白(含大五碼的空白)。

    • 性別:
      格式需求:至少選一個

    • 個人密碼:
      格式需求:5 至 8 個英文字母或數字,但不能全是英文字母或全是數字
  10. (***) 抽取網頁中的連結: 在此作業中,我們將練習使用通用表示法來抽取網頁中的連結(包含文字與網址)。為了取得網頁的內容,我們必須改用 WSH (Window Scripting Host) 來進行此作業,一個簡單的 WSH 範例程式如下:

    原始檔(titleExtract.js):(灰色區域按兩下即可拷貝)
    // Request a homepage and extract its title by regular expression
    // Roger Jang, 20081115
    url = "http://mirlab.org/jang/courses/webProgramming/homework/linkExtraction/testPage4linkExtraction.htm";
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    xmlHttp.open("GET", url, false, "");
    xmlHttp.send();				// Send the request
    contents = xmlHttp.responseText;	// Get the contents
    //WScript.Echo(contents);		// Print the contents if necessary
    
    // Use regular expression to extract the title
    re = new RegExp("<title>(.*?)<\/title>", "gi");;
    index=contents.search(re);
    WScript.Echo("index = " + index);
    WScript.Echo("title = " + RegExp.$1);

    若要執行此範例,請下載此範例後,在 DOS 視窗輸入

    cscript titleExtract.js 假設網路暢通,則此時在視窗所顯示的結果如下: Microsoft (R) Windows Script Host Version 5.7 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. index = 14 title = Web Programming (CS3431): Test page for link extraction 由此可見此範例可以正確地抽出所給網頁的標題。請注意,WSH 檔案的副檔名是 js,代表所用的程式語言是 JavaScript,所以本節所教的通用表示法都可以使用。唯一的小差別是:若要印出字串,在 WSH 必須使用 WScript.Echo("...")。

    你的任務,就是改寫此檔案,使其能使用通用表示法來抓出某一個網頁的連結,包含連結的文字與連結的網址。請注意,你的程式碼的功能可以由淺入深,達到下述三項功能:

    1. 能夠正確地抽取類似下列的連結:
      • It's me <A Href =/jang>It's <b>me</b></a>
      • This is Google <a HREF = "http://www.google.com">This is <u>Google</u></a>
    2. 介於 <xmp></xmp> 之間的連結,不應該被抽取。
    3. 能夠分辨同網域 (Same-domain) 的連結和異網域 (Different-domain)的連結。

    若以本作業網頁為例,所產生的輸出應該類似下述結果:

    Microsoft (R) Windows Script Host Version 5.7 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. regExpId01.htm ===> example/regExpId01.htm ===> Same domain regExpEnglishName01.htm ===> example/regExpEnglishName01.htm ===> Same domain generateIdNumber01.htm ===> exerciseTemplate/generateIdNumber01.htm ===> Same domain ... titleExtract.js ===> example/titleExtract.js ===> Same domain 所給網頁 ===> http://mirlab.org/jang/courses/webProgramming/homework/linkExtraction/testPage4linkExtraction.htm ===> Same domain It's me ===> /jang ===> Same domain This is Google ===> http://www.google.com ===> Different domain JavaScript 程式設計與應用:用於用戶端 ===> /jang/books/javaScript ===> Same domain (請試看看助教所給的測試網頁。)

JavaScript 程式設計與應用:用於網頁用戶端