【问题标题】:A complex domain name match rewrite rule复杂的域名匹配重写规则
【发布时间】:2022-01-24 13:27:27
【问题描述】:

我正在尝试为以下内容创建正则表达式规则,

规则用于匹配符合以下条件的域名

  1. 需要mach域名,foo.com
  2. 需要匹配a.com
  3. 需要匹配以下划线开头的域名,后跟字符编号(_f.a.com、_foo.foo.com,不匹配 _.com 或 _*.a.com)
  4. 需要匹配 *.a.com 或 *.foo.com ,不要匹配 *foo.com 或 *_foo.com
  5. 不要以点结尾

到目前为止,我达到了以下正则表达式

^(([a-zA-Z0-9]|\*\.[a-zA-Z0-9])|[a-zA-Z0-9_][a-zA-Z0-9-]){0,254}[a-zA-Z0-9](?:\.[a-zA-Z0-9]{2,})+$

问题是它不匹配 *.a.com ,它将匹配所有其他规则

感谢任何帮助

【问题讨论】:

    标签: regex preg-replace


    【解决方案1】:
    • 模式不匹配_f.a.com,因为_f可以在这里匹配[a-zA-Z0-9_][a-zA-Z0-9-],但是下面的字符是一个点,不能被任何替代项匹配,也不能被替换后的[a-zA-Z0-9] 部分
    • 模式与*.a.com 不匹配的原因几乎相同,只是这次是*.

    您可以使用以下方式匹配所有示例:

    ^(?:_|\*\.)?[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*$
    

    说明

    • ^ 字符串开始
    • (?:_|\*\.)? 可以选择匹配 _.*
    • [a-zA-Z0-9]+ 匹配任何范围的 1 次以上
    • (?:\.[a-zA-Z0-9]+)* 可以选择用前导点重复前面的内容
    • $字符串结束

    查看regex demo

    您可以根据需要使模式更具体,例如,如果最后一个点之后应该有 2 个或更多字符:

    ^(?:_|\*\.)?[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*\.[a-zA-Z0-9]{2,}$
    

    您可以将量词 {0,254} 用于任何字符类。

    【讨论】:

    • 这与 foo-fun.com 或 foo_fun.com 、_foo._as.com 不匹配
    • @sherin 这样的东西会匹配所有的例子^(?!_\.\w+$)(?:\*\.)?\w+(?:[.-]\w+)+$regex101.com/r/8cpIGz/1
    猜你喜欢
    • 2011-01-16
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2014-06-09
    相关资源
    最近更新 更多