你如何用正则表达式做这个条件情况?

时间:2011-06-27 13:36:21

标签: php javascript regex perl

  1. 以字母数字^[a-z0-9]
  2. 开始
  3. 然后是此可选点\.?
  4. 如果有一个点,那么必须跟着2到4个字母[a-z]{2,4}
  5. 必须以字母[a-z]$
  6. 结尾
  7. 必须是一个点,最多只有两个点。
  8. 就像域名一样:

    yahoo.co.ukyahoo.com,但您无法执行此操作yahoo.co.u或此yahoo.co.,是这样的。

4 个答案:

答案 0 :(得分:7)

您可以将可选点与必须遵循的2-4个字符分组:(\.[a-z]{2,4})。也就是说,您将拥有这些点+字母字符(\.[a-z]{2,4}){0,2}中的任何一个或最多两个。

必须以[a-z]部分结尾,您可以使用正面的后置(?<=[a-z])进行检查,将其作为完整的正则表达式:

^[a-z0-9]+(\.[a-z]{2,4}){0,2}(?<=[a-z])$

这适用于Perl和PHP正则表达式(PCRE),但不适用于JavaScript,因为它不支持lookbehind。在这种特定情况下,您可以解决该限制。

如果至少有一个点,则已经保证它将以[a-z]结束,因为该测试位于点所属的组中。如果没有点,则需要在结尾处强制[a-z]。要执行此操作,您可以将一个或多个量词(+)转换为零或更多(*),并在没有时将结束强制为[a-z] “点组”。当有点组时,您可以保持相同的模式,但现在至少有一个必需的点。

^([a-z0-9]*[a-z]|[a-z0-9](+\.[a-z]{2,4}){1,2})$

答案 1 :(得分:5)

这将检查以[a-z][0-9]开头的字符串,然后包含一个或两个点,后跟2/4个字母。它适用于您提供的示例(至少在Python中)(对于yahoo.co.ukyahoo.com为true,对yahoo.co.uyahoo.co.为false)

^[a-z0-9]+(\.[a-z]{2,4}){1,2}$

编辑 - 重新阅读后,我想你可能会想要这个:

^[a-z0-9]*([a-z0-9](\.[a-z]{2,4}){1,2}$|[a-z]$)

这将匹配不包含点但以字母结尾的字符串(除上述内容外),例如yahoo,但不包括yahoo2

答案 2 :(得分:-1)

试试这个:

^[a-z0-9](\.[a-z]{2,4}|.*[a-z]$)

答案 3 :(得分:-1)

^[a-z0-9](?=[^.]*\.[^.]+$|[^.]*\.[^.]\.[^.]+$)(\.(?=[a-z][a-z]){1,2}).*[a-z]$