簡體   English   中英

Eiffel正則表達式驗證

[英]Eiffel regular expression validation

如何為某個字符串創建正則表達式? 你可以在斷言(代碼的前提條件部分)中做到嗎?

我一直在谷歌周圍,但無法得到任何令人信服的東西。

問題是這樣的:

向DEPARTMENT(我們正在處理的類)創建過程添加前提條件,以確保電話號碼有效。 有三種可能的有效電話號碼格式。 有效的電話號碼包括以下其中一項:

  • 八位數,第一位是非零
  • 一個前導零,一個非零數字區號,然后是八個數字,第一個是非零
  • 一個前導'+',后跟一個兩位數的國家代碼,然后是一個非零數字區號,然后是八位數,其中第一個是非零

驗證電話號碼時,將忽略任何嵌入的空格。

作為解決此問題的一部分,將PHONE_NUMBER類添加到系統是可接受的,但不是必需的。

有幾個不同的問題需要回答:

  1. 如何檢查給定字符串是否與Eiffel中的指定正則表達式匹配? 可以使用Gobo庫中的類RX_PCRE_MATCHER 功能compile允許設置所需的正則表達式,並且功能recognizes允許測試字符串是否匹配。

  2. 如何為給定的電話號碼規范編寫正則表達式? "(|0[1-9]|\\+[0-9]{2}[1-9])[1-9][0-8]{7}"應該做但我還沒檢查過。 可以在正則表達式本身中考慮中間空白區域,但是在通過在輸入字符串上應用prune_all (' ')傳遞給正則表達式匹配器之前更容易去掉它們。

  3. 如何在創建過程中添加前置條件以驗證參數是否滿足它? 讓我們假設從前面的項目中我們構造了一個函數is_phone_number ,它接受一個STRING並返回一個BOOLEAN ,指示指定的字符串是否代表一個有效的電話號碼。 一個簡單的解決方案是寫

     make (tel: STRING) require is_phone_number (tel) ... 

    並在類DEPARTMENT本身中有一個功能is_phone_number 但這會阻止我們在調用此創建過程之前檢查指定的字符串是否代表電話號碼。 因此,將is_phone_number移動到類DEPARTMENT將繼承的類PHONE_NUMBER_VALIDATOR是有意義的。 同樣,如果PHONE_NUMBER需要根據指定的規則驗證字符串,它可以繼承PHONE_NUMBER_VALIDATOR is_phone_number用功能is_phone_number

Halikal實際上已經解決了這個問題,但直到現在還沒有分享......

這適用於eiffelStudio 6.2(注意 - 這是圖案片)

http://se.inf.ethz.ch/old/people/leitner/gobo_guidelines/naming_conventions.html

有效的電話號碼包括以下其中一項:

  • 八位數,第一位是非零
  • 一個前導零,一個非零數字區號,然后是八個數字,第一個是非零
  • 一個前導+后跟一個兩位數的國家代碼,然后是一個非零數字區號,然后是八位數,其中第一個是非零

驗證電話號碼時,將忽略任何嵌入的空格。

require                  -- 040 is ascii hex space
valid_phone: 
  match(phone, "^\040*[1-9]\040*([0-9]\040*){7}$") = TRUE or
  match(phone, "^\040*0\040*([1-9]\040*){2}([0-9]\040*){7}$") = TRUE or
  match(phone, "^\040*\+\040*([0-9]\040*){2}([1-9]\040*){2}([0-9]\040*){7}$") = TRUE


feature --Regular Expression check
  match(text: STRING; pattern: STRING): BOOLEAN is
        -- checks whether 'text' matches a regular expression 'pattern'
    require
      text /= Void
      pattern /= Void
    local
      dfa: LX_DFA_REGULAR_EXPRESSION         --There's the Trick!
      do
        create dfa.make
        dfa.compile(pattern, True)           --There's the Trick!
        check      -- regex must be compiled before we can use it
          dfa.is_compiled;
        end
        Result := dfa.matches(text)
     -- debug: make sure of which pattern
        if dfa.matches (text) then
          io.putstring(text + " matches " + pattern + "%N")
        end
      end
  end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM