【问题标题】:How do you do this conditional situation with regular expression?您如何使用正则表达式处理这种条件情况?
【发布时间】:2011-09-23 12:50:37
【问题描述】:
  1. 以字母数字 ^[a-z0-9] 开头
  2. 然后是这个可选的点\.?
  3. 如果有一个点,那么它后面必须跟 2 到 4 个字母 [a-z]{2,4}
  4. 必须以字母结尾[a-z]$
  5. 必须是一个点,最多只能是两个点。

就像域名:

yahoo.co.ukyahoo.com,但你不能这样做 yahoo.co.uyahoo.co.,是的,类似的。

【问题讨论】:

  • 你说“它域名”,但是域名吗?因为如果是这样,我想知道 Unicode 的特性。
  • 不是域名,而是域名
  • #4 - 无论是否有一个或多个 \.[a-z] ,第一部分是否需要以 [a-z] 结尾?

标签: php javascript regex perl


【解决方案1】:

您可以将可选点与必须跟随的 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,因为它不支持后视。在这种特定情况下,您可以解决该限制。

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

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

【讨论】:

  • 您的正则表达式没有后视将允许“.co.uk”
  • 感谢您的赐教。
【解决方案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

【讨论】:

  • 否:“以字母数字开头”。
  • 哦,对了 - 我以某种方式误读了您的评论。谢谢,应该修好了!
  • 你的最后一个方法有效,if(preg_match("/^[a-z0-9]*((\.[a-z]{2,4}){1,2}$|[a-z]$)/", "yahoo.com.au"))echo "ok"; 打印出okalert(/^[a-z0-9]*((\.[a-z]{2,4}){1,2}$|[a-z]$)/.test("yahoo.co.uk")); 结果是true。而且我已经在许多条件下进行了测试,到目前为止一切都很好。谢谢:)
【解决方案3】:

试试这个:

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

【讨论】:

  • alert(/^[a-z0-9](\.[a-z]{2,4}|.*[a-z]$)/.test("yahoo.co.u")); 结果是true。我期待false :(
  • 你在说什么??根据您的要求“yahoo.co.u”应该通过:它以 alpha (y) 开头,(a) 后面没有点,并以 alpha 结尾!此外,您已经用第 5 点更改了您的问题(仍然通过)。请删除反对票!
  • OP 明确指出 "yahoo.co.u" 不应匹配。而且我认为除非在最初的几分钟或编辑后,否则不能删除反对票。把你的答案改成有用的东西,你可能会很幸运。
  • 反对票不是来自 Yoyo_c。这是我的。我通常只用代码对答案投反对票,因为我觉得它们没有用,尤其是在regex 中。但更重要的是,这不符合要求。 “如果有一个点,那么它必须后跟 2 或 4 个字母 [a-z]{2,4}”。这就是为什么“yahoo.co.u”不应该通过的原因。
【解决方案4】:
^[a-z0-9](?=[^.]*\.[^.]+$|[^.]*\.[^.]\.[^.]+$)(\.(?=[a-z][a-z]){1,2}).*[a-z]$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多