三个字母和四个数字的Regex



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

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

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

这个正则表达式的问题是它也接受4个字母的组合,但我只想要三个连续的字母。为了实现这一点,我需要在正则表达式中更改什么?

您可以使用:

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

RegEx演示

RegEx详细信息:

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

您需要将备选方案封装在一个组中,以便锚应用于所有备选方案:

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

regex101 演示

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

您的第一个匹配字母的备选方案只有^锚,因此它只检查输入是否以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})$

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

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

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

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

请参阅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')

最新更新