如何使用正则表达式处理这种条件情况


How do you do this conditional situation with regular expression?

  1. 以字母数字^[a-z0-9]开头
  2. 然后是这个可选的点'.?
  3. 如果有一个点,那么它后面必须跟2到4个字母[a-z]{2,4}
  4. 它必须以字母表[a-z]$结尾
  5. 它必须是一个点,并且最多只有两个点

这就像域名:

yahoo.co.ukyahoo.com,但你不能做这个yahoo.co.u或这个yahoo.co.,是的,诸如此类。

您可以将可选点与后面必须包含的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中不起作用,因为它不支持lookbacking。在这种特定情况下,您可以绕过该限制。

如果至少有一个点,就可以保证它将以[a-z]结束,因为该测试在该点所属的组中。如果没有点,则需要在末尾强制使用[a-z]。要做到这一点,您可以将一个或多个量词(+)变成零或多个(*),并在没有"点组"时强制结束为[a-z]。当有点组时,可以保持相同的图案,但现在至少有一个强制点。

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

这会检查一个以[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

试试这个:

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