我想不出一个正则表达式与[A-Z0-9] +中最多出现20个字符的破折号匹配,所以就像-和[A-Z0-9] +总共最大20个字符。
这是我能获得但没有用的最接近的模式
([A-Z0-9]{1,19}|\-{1})
答案 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 + ")");
}
});