Regex 正则表达式匹配(如果之前存在)

Regex 正则表达式匹配(如果之前存在),regex,Regex,所以我想检查输入字符串是否可以用作文件大小的表示。 例子;这些是有效的: 15kb 12mb 128b 64gib 12mib 这些都是无效的: 12m 0mb gb gib 64ib 52ki 除了检查无效值23ib之外,所有操作都正常。这是我的正则表达式: ^([1-9]\d+)(?i)([k|m|g|t|p]?i?)b$ 因此,如果前面的组也匹配,我只想匹配字符I。您可以将[kmgtp]设置为必须,但整个第二组都是可选的并使用 (?i)^([1-9]\d*)([kmgtp]i?)?b

所以我想检查输入字符串是否可以用作文件大小的表示。 例子;这些是有效的:

15kb
12mb
128b
64gib
12mib
这些都是无效的:

12m
0mb
gb
gib
64ib
52ki
除了检查无效值
23ib
之外,所有操作都正常。这是我的正则表达式:

^([1-9]\d+)(?i)([k|m|g|t|p]?i?)b$

因此,如果前面的组也匹配,我只想匹配字符
I

您可以将
[kmgtp]
设置为必须,但整个第二组都是可选的并使用

(?i)^([1-9]\d*)([kmgtp]i?)?b$
等价物:

(?i)^([1-9]\d*)((?:[kmgtp]i?)?)b$

注:

  • [k | m | g | t | p]?i
    匹配可选的
    k
    m
    g
    t
    p
    ,然后匹配可选的
    i
    ,因此
    i
    可以不使用前面的辅音进行匹配
  • [k | m | g | t | p]
    匹配
    k
    m
    g
    t
    p
    字符,您应该从字符类中删除
  • 如果使用
    [1-9]\d+
    ,则无法将
    2b
    类字符串与一位数字匹配。将
    \d+
    替换为
    \d*
    将修复此问题,因为
    *
    匹配0次或多次出现
  • 在这里的模式开头使用内联修饰符
    (?i)
    ,因为它可能会影响所有的模式

您可以强制执行
[kmgtp]
,但整个第二组都是可选的,可以使用

(?i)^([1-9]\d*)([kmgtp]i?)?b$
等价物:

(?i)^([1-9]\d*)((?:[kmgtp]i?)?)b$

注:

  • [k | m | g | t | p]?i
    匹配可选的
    k
    m
    g
    t
    p
    ,然后匹配可选的
    i
    ,因此
    i
    可以不使用前面的辅音进行匹配
  • [k | m | g | t | p]
    匹配
    k
    m
    g
    t
    p
    字符,您应该从字符类中删除
  • 如果使用
    [1-9]\d+
    ,则无法将
    2b
    类字符串与一位数字匹配。将
    \d+
    替换为
    \d*
    将修复此问题,因为
    *
    匹配0次或多次出现
  • 在这里的模式开头使用内联修饰符
    (?i)
    ,因为它可能会影响所有的模式

    • 为什么不更明确地指定值呢?这样,您就可以擦除类似于
      20pib
      的内容

      ^(\d+)(?i)([kmg]?i?|p|t)b$
      
      这包括使用\d+而不是
      [1-9]\d*
      的0值,如
      0mb
      ,这对我来说更容易阅读


      请参阅。

      为什么不更明确地指定值?这样,您就可以擦除类似于
      20pib
      的内容

      ^(\d+)(?i)([kmg]?i?|p|t)b$
      
      这包括使用\d+而不是
      [1-9]\d*
      的0值,如
      0mb
      ,这对我来说更容易阅读



      请参阅。

      0b
      应有效(文件可以为空)@Cid通常说:是。但是我不需要零字节。像
      10gb
      这样的字符串有效吗?为什么0mb无效?是否要求0UNIT无效?请理解@Cid,只是想知道它是否故意被排除在有效模式之外。我想这不是一个完整的清单。我们可以假设OP意味着包含它(以及其他一些有效大小)。
      0b
      应该是有效的(文件可以是空的)@Cid一般来说:是的。但是我不需要零字节。像
      10gb
      这样的字符串有效吗?为什么0mb无效?是否要求0UNIT无效?请理解@Cid,只是想知道它是否故意被排除在有效模式之外。我想这不是一个完整的清单。我们可能只是假设OP意味着包含它(以及其他一些有效的大小)。“但是我不需要零字节来实现我的目的。”@Cid我已经阅读了评论,它不是必需的。我问为什么它是无效的。那么这应该是一个评论,而不是一个评论answer@Cid你看过我的答案了吗?在我的回答中,还有更多不同于Wiktors的地方。在开始争论之前,请清楚地告诉自己。我还指出了消除pid和更好的可读性。这不是因为愤怒,这只是没有回答问题。另外,您正在根据自己的喜好更改预期输出,“但我的目的不需要零字节”。@Cid我已经阅读了评论,认为这不是必需的。我问为什么它是无效的。那么这应该是一个评论,而不是一个评论answer@Cid你看过我的答案了吗?在我的回答中,还有更多不同于Wiktors的地方。在开始争论之前,请清楚地告诉自己。我还指出了消除pid和更好的可读性。这不是因为愤怒,这只是没有回答问题。另外,您正在根据自己的口味更改预期产量