【问题标题】:Make mandatory group in JavaScript regex在 JavaScript 正则表达式中创建强制组
【发布时间】:2020-08-14 12:34:07
【问题描述】:

我的字符串要求是 m+/-n.n。它将接受字符串 m 加(+)或减(-)任何整数或十进制数。即m+1、m+.1、n+0.1、m+1.1,与减号(-)类似。

我尝试了正则表达式模式'^(?:m|M)[+-](\\d{1,})?(\\.\\d{1,0})?$'

这里的问题是它也接受'm+'或'm-',这是不应该的。这里[+-]后面有两组,都是单独可选的,需要支持0.1、0.1、1、1.1。想要将这两组转换为一组并强制设置。

【问题讨论】:

  • 您可以获得单个捕获组[Mm][+-](\d*\.?\d+),它将匹配M+m+,但它不是该组的一部分,并且该组不是可选的。 regex101.com/r/hUGUHq/1
  • 应该只有 1 个强制组权限与 1.1 .1 等值匹配?
  • 如果有可能,为什么不呢?
  • 我添加了一个使用强制单个捕获组的解决方案。阅读这个问题,我认为这是预期的结果。

标签: javascript regex regex-group


【解决方案1】:

一种方法是在两组之前添加一个前瞻:

^(?:m|M)[+-](?=[\d.])(\d+)?(\.\d+)?$

这里我添加了(?=[\d.]),它断言[+-] 之后必须有.\d,但不会消耗它,因为它应该在前瞻之后由可选组消耗.

Regex Demo

【讨论】:

    【解决方案2】:

    您可以使用 character class 匹配 M 或 m 和 + 或 -。

    然后在第 1 组中捕获匹配 0+ 个数字、一个可选的点和 1+ 个数字。

    这种方式有一个单独的捕获组,它不是可选的,因此像m- 这样的字符串不会单独匹配。

    ^[Mm][+-](\d*\.?\d+)$
    

    说明

    • ^ 字符串开始
    • [Mm] 匹配 M 或 m
    • [+-] 匹配 + 或 -
    • (捕获组1
      • \d*\.?\d+ 匹配 0+ 位,可选 . 和 1+ 位
    • )关闭第一组
    • $字符串结束

    Regex demo

    注意,在示例中,\d{1,0} 无效。

    【讨论】:

      猜你喜欢
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      相关资源
      最近更新 更多