1

如何为某个字符串创建正则表达式?你可以在断言(代码的前置条件部分)中做到这一点吗?

我一直在谷歌搜索,但没有得到任何令人信服的东西。

问题是这样的:

向 DEPARTMENT(我们正在处理的类)创建过程添加一个前提条件,以确保电话号码有效。有三种可能的有效电话号码格式。有效的电话号码包括以下之一:

  • 八位数字,其中第一位非零
  • 一个前导零,一个非零数字区号,然后是八位数字,其中第一个非零
  • 前导“+”,后跟两位国家代码,然后是单个非零数字地区代码,然后是八位数字,其中第一个非零

验证电话号码时,将忽略任何嵌入的空格。

作为解决此问题的一部分,将 PHONE_NUMBER 类添加到系统是可以接受的,但不是必需的。

4

2 回答 2

2

有几个不同的问题需要回答:

  1. 如何检查给定的字符串是否与 Eiffel 中的指定正则表达式匹配?可以使用RX_PCRE_MATCHERGobo 库中的一个类。该功能compile允许设置所需的正则表达式,并且该功能recognizes允许测试字符串是否匹配。

  2. 如何为给定的电话号码规范编写正则表达式?"(|0[1-9]|\+[0-9]{2}[1-9])[1-9][0-8]{7}"虽然我没有检查过,但应该做的事情。可以在正则表达式本身中考虑中间空格,但在通过prune_all (' ')输入字符串传递给正则表达式匹配器之前摆脱它们要容易得多。

  3. 如何在创建过程中添加前提条件以验证参数是否满足?假设我们从前面的项目中构造了一个函数,该函数is_phone_number接受 aSTRING并返回 a BOOLEAN,指示指定的字符串是否表示有效的电话号码。一个简单的解决方案是写

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

    is_phone_number并且在类DEPARTMENT本身中有一个特性。但这会阻止我们在调用此创建过程之前检查指定的字符串是否代表电话号码。is_phone_number所以转移到PHONE_NUMBER_VALIDATORDEPARTMENT将继承的类是有意义的。同样,如果PHONE_NUMBER需要根据指定规则验证字符串,它可以继承PHONE_NUMBER_VALIDATOR和重用该特性is_phone_number

于 2011-03-28T07:26:37.930 回答
2

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
于 2012-04-02T23:31:29.437 回答