【问题标题】:Regex for three letters and four numbers?三个字母和四个数字的正则表达式?
【发布时间】:2020-03-05 11:53:37
【问题描述】:

我应该创建这个接受以下格式的正则表达式:

  1. 任意 3 个字母(不区分大小写,除字母字符外无其他字符)
  2. 任何 2 个中间有破折号的字母(不区分大小写)
  3. 任意 4 位数字

这是我目前想出的:^([a-zA-Z]([a-zA-Z]|-)[a-zA-Z])|[0-9]{4}$

这个正则表达式的问题是它也接受 4 个字母的组合,但我只想要三个连续的字母。我需要在我的正则表达式中进行哪些更改才能完成此操作?

【问题讨论】:

  • 连续3个字母表示abcbcdcde等?
  • @Barmar 是的,没错!
  • 但不是ace,因为它们在字母表中不是连续的,对吧?
  • @Barmar 抱歉,我之前误解了您的评论。 ace 之类的东西应该可以工作,snk,lbd 等所有这些都应该能够工作。我的意思是所有字母的序列。
  • 参见thisthis 正则表达式中的连续字母。这不是一件容易完成的事情,坦率地说,这不是一个好主意。

标签: regex validation


【解决方案1】:

您可以使用字符类和修饰符优化您的正则表达式,使您的模式更简洁:

例如,在 JavaScript 语法中,这将是

/\d{4}|[a-z]([a-z]|-)[a-z]/ig

  • \d 是数字 [0-9] 的缩写
  • i 代表不区分大小写
  • g 代表全局,它将匹配所有出现,而不仅仅是第一个

See example on Regex101

const pattern = /\d{4}|[a-z]([a-z]|-)[a-z]/ig

const test = (desc, str) => {
  const match = (str.match(pattern) || []).join(', ')
  console.log(desc, '\n', str, '→', match, match ? '✓' : '×')
}

test('Any 3 letters (case-insensitive, no other characters except for alphabetic characters)', 'fourhundredandfive')
test('Any 2 letters with a dash in between (case-insensitive)', 'no-one')
test('Any 4 digits', 'ab 1234567 ab')

【讨论】:

    【解决方案2】:

    您的第一个匹配字母的替代方案只有 ^ 锚点,因此它只检查输入是否以 3 个字母或以连字符分隔的 2 个字母开头。

    您的第二个替代方案只有 $ 锚点,因此它只检查输入的结尾是否为 4 位数字。

    您需要将两个锚点都放在两个选项中。

    ^([a-zA-Z]([a-zA-Z]|-)[a-zA-Z])$|^[0-9]{4}$
    

    或者在除了锚点之外的所有东西周围放置另一个组。

    ^(([a-zA-Z]([a-zA-Z]|-)[a-zA-Z])|[0-9]{4})$
    

    【讨论】:

    • ([a-zA-Z]|-)[a-zA-Z-] 相同
    【解决方案3】:

    你可以使用:

    ^(?:[a-zA-Z][a-zA-Z-][a-zA-Z]|[0-9]{4})$
    

    RegEx Demo

    正则表达式详细信息:

    • ^:开始
    • (?:: 启动匹配这两个选项之一的非捕获组
      • [a-zA-Z][a-zA-Z-][a-zA-Z]:匹配 3 个字母或 letter-letter
      • |: 或者
      • [0-9]{4}:匹配4位数字
    • ): 结束非捕获组
    • $:结束

    【讨论】:

      【解决方案4】:

      您需要将您的交替包含在一个组中,以便锚适用于所有它们:

      ^(([a-zA-Z][a-zA-Z-][a-zA-Z])|[0-9]{4})$
      

      Demo on regex101

      请注意,您可以简单地将- 包含在第一个替换的第二个字符类中,因为[a-zA-Z-] 等同于([a-zA-Z]|-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多