為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題(排除輸入或語法錯誤)在於如何描述想要的東西。
換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確。例如,如果程式計算下面的表示式:
pay = weekly_salary * 52
並知道這些變數的值,它將計算出正確的結果。但是有人會反對,因為公式沒有說明銷售人員,他也得到了乙份佣金。所以為了描述這種情況,這個表示式需要重新用公式表示為:
pay = weekly_salary * 52 + commission
也許你會認為,編寫第乙個表示式的人沒有完全理解問題所涉及的範圍,因此不能很好地進行描述。知道如何詳細的進行描述是很重要的。如果請求某人為你拿一本書,而且如果擺在面前有很多書,那麼就需要更加明確地描述你想要的書(或者滿足與不確定的選擇過程)。
這同樣適用於正規表示式。程式(例如grep)簡單而且容易使用。理解正規表示式的元素也不難。正規表示式允許編寫簡單的或複雜的模式描述。而使編寫正規表示式很難(和有趣)的因素是應用的複雜性:模式出現在各種不同的情況和上下文中。複雜性是語言本身所固有的,就像你並不總能通過查詢字典來獲得某個語義的正確理解一樣。
編寫正規表示式的過程涉及3個步驟:
1.知道要匹配的內容以及它如何出現在文字中。
2.編寫乙個模式來描述要匹配的內容。
3.測試模式來檢視它匹配的內容。
這個過程實質上與程式設計師開發程式的過程相似。步驟1可以當作規範,它反映理解要解決的問題以及如何解決它。步驟2類似於編寫程式**,而步驟3相當於執行程式並根據規範測試它。步驟2和步驟3需重複進行,知道程式令人滿意為止。
對匹配描述進行測試可以確保這個描述和所期待的一樣。它通常揭示一些令人驚奇的事。仔細檢查測試的結果、比較輸出和輸入,這可以大大地提高對正規表示式的理解。可以按下面的方式解析模式匹配的結果:
hits (擊中)
--這是我想要匹配的行。
misses (未擊中)
--這是我不想匹配的行。
omissions (遺漏)
--這是我不能匹配但想要匹配的行。
false alarms (假警報)
--這是我不想匹配的但卻匹配了的行。
嘗試完善模式的描述也可以從對立段解決;可以試著通過限制可能的匹配來排錯假警報,通常擴充套件可能的匹配來試著捕獲遺漏。
當你必須使用固定的字串描述模式時,困難尤其明顯。從固定字串的模式中刪除每個字元都會增加可能的匹配數量。例如,當搜尋字串"what" 時,還決定匹配"what",那麼同時匹配"what"和"what"的惟一的固定字串模式是"hat",即兩者共用的最長的字串。顯然,搜尋"hat"將產生不想要的匹配。給固定字串模式新增每個字元都可能減少匹配數量。字串"them" 通常比字串"the"產生的匹配更少。
參考資料:
編寫正規表示式
是不是感覺有點無從下手?別慌,慢慢來。通過對比網頁和網頁 我們確認資訊特徵。房產名稱 急降60萬 急賣全款客戶來 寶山二村好位置複製該資訊,到html檔案中通過ctrl f查詢該資訊,然後認真檢視 房產名稱 前後的字元特徵 前面的字元特徵 後面的字元特徵 現在對照房產名稱前後的字元特徵編寫正規表示式...
正規表示式表
元字元 描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了regexp物件的multiline屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束位置。...
正規表示式表
元字元 描述將下乙個字元標記符 或乙個向後引用 或乙個八進位制轉義符。例如,n 匹配 n。n 匹配換行符。序列 匹配 而 則匹配 即相當於多種程式語言中都有的 轉義字元 的概念。匹配輸入字串的開始位置。如果設定了regexp物件的multiline屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的...