【问题标题】:Using OR operator with Lookahead and length limitter将 OR 运算符与 Lookahead 和长度限制器一起使用
【发布时间】:2022-01-28 02:01:40
【问题描述】:

我正在尝试编写一个正则表达式,我想在其中测试两件事。该字符串仅在以 +20 开头且长度介于 1 和 5 之间,或不以 +20 开头但仍以加号 + 作为其第一个字符时才有效(例如 +50 ) 并且它的长度在 1 到 7 之间,那么它也是有效的。 这是我为这个验证写的:

/^\+(?=20){1,5}|^\+(?!20){1,7}/g

我测试了它,但它并没有按照我的预期工作,我不明白为什么。

【问题讨论】:

  • 第二组 +(?!20) 不够明确,+50 应该匹配,但 +Xx 也应该匹配。如果最多 5 个字符,最后两个字符是什么?数字,单词?...?
  • 我已经编辑了我的答案来解释你的正则表达式有什么问题。

标签: javascript regex


【解决方案1】:

你所拥有的很接近,但你需要:

  • 添加要量化的字符选择器.. 可以匹配所有内容)
  • $约束字符串的结尾以防止长度超过最大值
  • 可以删除 g 标志,因为您只想要一个匹配项

剩下的就是:

/^\+(?=20).{1,5}$|^\+(?!20).{1,7}$/

你也可以这样写

/^\+((?=20).{1,5}|(?!20).{1,7})$/

【讨论】:

    【解决方案2】:

    在您的正则表达式中,(?=20){1,5} 表示“在 1 到 5 次之间执行正向预测 (?=20){1,5}”。这与执行一次具有相同的效果,显然不是您想要的。你想要的那部分表达式是

    (?=20).{1,5}
    

    其内容为“匹配 1 到 5 个字符,其中前两个必须是 '20'”。

    但这仍然是个问题,因为它匹配字符串 '+20012 quick brown dogs' 中的 '+20012' 你需要一个字符串尾锚

    ^\+(?=20).{1,4}$|...
    

    请注意,我还将 {1,5} 更改为 {1,4},因为字符串最多可以包含 5 个字符,或者在“+”之后最多包含 4 个字符。还要注意与上面是一样的

    ^\+20.{1,2}$|...
    

    这更简单,可以说读起来更好。因此,您可以将整个正则表达式修改为

    ^\+20.{1,2}$|^\+(?!20).{1,6}$/g
    

    或者,为了减少重复,

    ^\+(?:20.{1,2}|(?!20).{1,6})$/g
    

    首先,匹配“+200X”。它应该,除非是,“......当它以 +20 开头......”你的意思是,“......当它以 +20 开始时没有后跟数字......”。在我接下来的解决方案中,我假设您的意思是后者。


    您可以尝试匹配以下正则表达式:

    ^\+(?:20(\D.?)?|(?!20(?!\d)).{0,6})$
    

    Demo

    表达式可以分解如下。

    ^           # match beginning of string
    \+          # match '+'
    (?:         # begin non-capture group
      20        # match '20'
      (?:\D.?)? # optionally match a non-digit that is optionally
                # followed by any character
    |           # or
      (?!       # begin negative lookahead
        20      # match '20'
        (?!\d)  # negative lookahead asserts '20' is not followed by a digit
      )         # end negative lookahead
      .{0,6}    # match between 0 and 6 characters
    )           # end non-capture group
    $           # match end of string
    

    注意'+200' 与替换的第二部分匹配(字符串不以'20'开头)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 2022-11-17
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多