题
如何为某个字符串创建正则表达式?你可以在断言(代码的先决条件部分)中做到这一点吗?
我一直在google周围,但无法得到任何令人信服的东西。
问题是这样的:
在部门(我们正在处理的类)创建过程中添加一个先决条件,以确保电话号码有效。有三种可能的有效电话号码格式。有效的电话号码包括:
- 八位数字,其中第一个是非零
- 一个前导零,一个非零数字区号,然后是八位数字,第一个 其中非零
- 一个前导'+',后跟一个两位数的国家代码,然后是一个非零数字 区号,然后是八位数字,其中第一位是非零
在验证电话号码时,任何嵌入的空格都将被忽略。
将PHONE_NUMBER类作为系统的一部分添加到系统是可以接受的,但不是必需的。 解决这个问题。
解决方案
有几个不同的问题需要回答:
如何检查给定的字符串是否与Eiffel中的指定正则表达式匹配?一个可以使用类
RX_PCRE_MATCHER
从戈博图书馆。特征compile
允许设置所需的正则表达式和功能recognizes
允许测试字符串是否匹配。如何为给定的电话号码规范编写正则表达式?类似的东西
"(|0[1-9]|\+[0-9]{2}[1-9])[1-9][0-8]{7}"
应该做的,虽然我还没有检查过。在正则表达式本身中可以考虑中间空格,但是在通过应用传递到正则表达式匹配器之前要容易得多prune_all (' ')
在输入字符串上。如何在创建过程中添加前置条件以验证参数是否满足它?让我们假设从前面的项目中我们构造了一个函数
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