我应该创建一个接受以下格式的正则表达式:
- 任意3个字母(不区分大小写,除字母字符外没有其他字符(
- 中间带破折号的任意2个字母(不区分大小写(
- 任意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')