【问题标题】:Do not match if there is more than one of a single character如果有多个单个字符,则不匹配
【发布时间】:2018-04-13 17:49:40
【问题描述】:

我需要创建一个正则表达式来验证任何没有点的文本或任何以.gt.lt 结尾的文本。任何多于一个点的文本也应该是无效的。

anytext // valid
anytext.gt // valid
anytext.lt // valid
anytext.xx // invalid
anytext.xx.gt // invalid

我创建了这个:^.*(\.(gt|lt)|(?<!\..*))$

它工作得很好,除了它接受超过 1 个点,所以像 foo.bar.gt 这样的东西正在被验证,不应该。

【问题讨论】:

    标签: regex


    【解决方案1】:

    您可以匹配一个或多个单词字符\w+ 或在字符类中指定要匹配的内容并以可选的点结尾,后跟 gt 或 lt:

    ^\w+(?:\.[gl]t)?$

    说明

    • ^ 在行首断言位置
    • \w+ 一个或多个word characters
    • (?:非捕获组
      • \.[gl]t 匹配一个点和gl 后跟t
    • )?关闭非捕获组并使其可选
    • $在行尾断言位置

    【讨论】:

      【解决方案2】:

      你可以使用:

      ^[^.\n]+(\.(gt|lt))?$
      

      解决方案的主要区别:

      • 我用[^.\n]代替了“初始”. - 任何字符 除了点或换行符。
      • 作为它后面的量词,我使用了+,只接受非空内容。
      • 我放弃了第二个备选方案 ((?<!\..*)) 和前面的 |
      • 在捕获组之后我添加了?,因为.lt.gt 后缀是可选的。

      还有一点:在否定的lookbehind中你不能使用量词 (你试过.*)。

      【讨论】:

      【解决方案3】:

      我认为这很简单:

      ^[^.]+(\.[gl]t)?$
      

      See Regex101 demo here.

      【讨论】:

      • 你可能想做^[^.]+?(\.[gl]t)?$(贪婪),否则它可能会捕获两行而不是一行。
      • OP 确实说“任何文本”;-)
      • 令人怀疑的换行符被认为是“文本”。事实上,您只需要做^([^.]+\.[gl]t)$,这将比您当前的解决方案少 24 步。
      【解决方案4】:

      就这么简单:^\w+(\.[gl]t){0,1}$\w 将匹配 .gt.lt 之前的任何字符串

      【讨论】:

      • 该解决方案看起来很熟悉 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-18
      • 1970-01-01
      相关资源
      最近更新 更多