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

我一直在google周围,但无法得到任何令人信服的东西。

问题是这样的:

在部门(我们正在处理的类)创建过程中添加一个先决条件,以确保电话号码有效。有三种可能的有效电话号码格式。有效的电话号码包括:

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

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

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

有帮助吗?

解决方案

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

  1. 如何检查给定的字符串是否与Eiffel中的指定正则表达式匹配?一个可以使用类 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)
        ...
    

    并有一个特点 is_phone_number 在课堂上 DEPARTMENT 本身。但这会阻止我们在调用此创建过程之前检查指定的字符串是否代表电话号码。所以移动是有道理的 is_phone_number 向全班同学致意 PHONE_NUMBER_VALIDATOR 那堂课 DEPARTMENT 将继承。同样,如果 PHONE_NUMBER 需要根据指定的规则验证字符串,它可以继承 PHONE_NUMBER_VALIDATOR 并重复使用该功能 is_phone_number.

其他提示

halikal实际上是这个掉了这个,但达迪不分享到现在...

这在eiffelstudio 6.2中有效(注意 - 这是gobo)

http://se.inf.ethz.ch//旧/人/ 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归因
不隶属于 StackOverflow
scroll top