正则表达式可与[A-Z0-9] +中任何位置的破折号一起出现,总共出现20个字符

时间:2019-06-04 10:36:30

标签: regex

我想不出一个正则表达式与[A-Z0-9] +中最多出现20个字符的破折号匹配,所以就像-和[A-Z0-9] +总共最大20个字符。

这是我能获得但没有用的最接近的模式

([A-Z0-9]{1,19}|\-{1})

2 个答案:

答案 0 :(得分:1)

为什么要使用正则表达式,尤其是单个正则表达式?这些条件更容易单独检查。

例如,使用Perl:

if (length($str) <= 20 && $str =~ /\A[A-Z0-9]*-[A-Z0-9]*\z/)

答案 1 :(得分:1)

另一种选择是使用正向先行并将长度声明为1至20个字符:

^(?=.{1,20}$)[A-Z0-9]*-[A-Z0-9]*$

根据工具或语言的不同,如果要使用与^$不同的锚来匹配字符串或行的开头和结尾,则可以查看this page

例如:

let pattern = /^(?=.{1,20}$)[A-Z0-9]*-[A-Z0-9]*$/;
[
  "AAAAAAAAAA-AAAAAAAAA",
  "-",
  "A-A",
  "-A",
  "A-",
  "A",
  "AAAAAAAAAAA-AAAAAAAAA",
  "AAAAAAAAAAAAAAAAAAAA",
].forEach(s => {
  if (pattern.test(s)) {
    console.log("Match: '" + s + "'  (Nr of chars: " + s.length + ")");
  } else {
    console.log("No match: '" + s + "'  (Nr of chars: " + s.length + ")");
  }
});