正则表达式只接受 5 个数字,然后在打字稿上接受破折号或字母

Regex to accept only 5 numbers and then a dash or a letter on typescript

我正在处理正则表达式的问题。 我有一个最大长度为 10 的输入。

到目前为止,我实现了第一个给定值可以是数字,例如 12345,但随后它等待破折号,然后您可以写一个字母或再次写一个数字 maxLength=10 例如:12345-a121 是允许并且它适用于 currrent

但我希望在 5 位数字之后允许字母或破折号,因为目前使用此正则表达式仅允许在 5 位数字之后使用破折号。 例如 12345a 或 12345- 被允许。 这是我正在使用的实际正则表达式。

Valid/Matches: 12345a235, 123a, 12345-aa1, 12345a, 12345-a.  

Not Valid/Does not matches: -11, 111111, aaaa, 

(?=^[^W_]{1,5}-[^W_]{1,8}$)^.{1,10}$|^[^W_]{1,5}$

我正在 regex101.com 上调试,但我找不到允许的方法。 例如 12345a

这是检查是否匹配的条件。

if (!this.value.toString().match('^\d{1,5}(?!\d+)[-\p{L}\d]+$') && this.value.toString()) {
      return ValidationInfo.errorCode("You need to do something");

感谢您的帮助

编辑因为第一种方法的模式可以简化并且也没有结束序列长度的限制。

示例代码...

const multilineSample = `12345a235
123a
12345-aa1
12345a
12345-a

12-a235dkfsf
12-a235dkfsfs

123a-dssava-y
123a-dssava-1a

12345-aa1--asd-
12345-aa1--asd-s

-11
111111
aaaa`;

// see ... [https://regex101.com/r/zPkcwv/3]
const regXJustMatch = /^\d{1,5}[-\p{L}][-\p{L}\d]{0,9}$/gmu;

// see ... [https://regex101.com/r/zPkcwv/4]
const regXNamedGroups =
  /^(?<digitsOnly>\p{N}{1,5})(?<miscellaneous>[-\p{L}][-\p{L}\p{N}]{0,9})$/gmu;

console.log(
  'matches only ...',
  multilineSample.match(regXJustMatch)
);
console.log(
  'matches and captures ...', [
    ...multilineSample.matchAll(regXNamedGroups)
  ]
  .map(({ 0: match, groups }) => ({ match, ...groups }))
);
.as-console-wrapper { min-height: 100%!important; top: 0; }


第一种方法

对于这两种变体,显然都以 ...

开头

也很清楚,想要以任何破折号and/or字的字符序列结束。由于必须排除 _,不能只使用 \w 转义字母和数字,因为 \w covers/includes _ 也是如此。但是可以使用 unicode property escapes,因此 ...

  • 用有效字符 class 覆盖行尾的正则表达式是 ...
    • 已经混了...[-\p{L}\d]+$
    • 主要是 unicode 转义 ... [-\p{L}\p{N}]+)$

像... /^\d{1,5}[-\p{L}\d]+$/u ... 这样的组合正则表达式几乎涵盖了要求,但由于 111111 而失败,即使它不符合要求,也无法匹配。

A negative lookahead ... (?!\d+) 分别 (?!\p{N}+) ... 紧跟在起始数字序列之后确实阻止了任何其他(终止)digit-only 序列,因此 123456 不再匹配。

示例代码...

const multilineSample = `12345a235
123a
12345-aa1
12345a
12345-a

-11
111111
aaaa`;

// see ... [https://regex101.com/r/zPkcwv/1]
const regXJustMatch = /^\d{1,5}(?!\d+)[-\p{L}\d]+$/gmu;

// see ... [https://regex101.com/r/zPkcwv/2]
const regXNamedGroups =
  /^(?<digitsOnly>\p{N}{1,5}(?!\p{N}+))(?<miscellaneous>[-\p{L}\p{N}]+)$/gmu;

console.log(
  'matches only ...',
  multilineSample.match(regXJustMatch)
);
console.log(
  'matches and captures ...', [
    ...multilineSample.matchAll(regXNamedGroups)
  ]
  .map(({ 0: match, groups }) => ({ match, ...groups }))
);
.as-console-wrapper { min-height: 100%!important; top: 0; }