通过RegExp(美国、欧盟、日本、澳大利亚)验证文胸尺寸



我想检查输入是否是有效的bra测量。在美国,文胸的尺码用偶数28-48和字母a-I、AAA、AA、DD、DDD、HH或HHH书写。欧盟、日本和澳大利亚使用不同的编号和图案,例如90C C90和DD6。

-我想把字母和数字分开,检查字母是否在A-I或AA、AAA、DD、DDD、HH或HHH之间,数字是否为28-48(仅限偶数(、60-115(增量为5,因此为65、70、75等(或6-28偶数。

var input = $("#form_input").val("");

var bust = input.match(/[d.]+|D+/g);

var vol = bust[0];

var band = bust[1];

我可以写一个长测试条件:

如果((vol>28&&vol<48(&amp;band=";AAAband=";AA"||band=";A"||band=";B"||等等({//一些代码

}else{错误消息"}``

我该如何缩短它并使用regex完成上述操作?

这是一个有点长的替代模式,但如果缺少或匹配太多,您可以很容易地调整范围。

您可以首先使用test检查模式是否匹配。要获得band和vol匹配,一个选项是从匹配中提取数字或大写字符,因为存在匹配,例如90CC90

^(?:(?:28|3[02468]|4[02468])(?:AA?|[BC]|D{1,4}|[E-I])|(?:[6-9][05]|1[01][05])(?:AA?|[BC]|DD?|[E-I])|[A-I](?:[6-9][05]|1[01][05])|(?:[68]|1[02468]|2[0246])(?:AA?|[BC]|DD?|[E-I]))$

解释

  • ^字符串开始
  • (?:备选方案的非捕获组
    • (?:28|3[02468]|4[02468])从28-48按2步匹配
    • (?:AA?|[BC]|D{1,4}|[E-I])匹配AA、A、B、C,1-4乘以D或范围E-I
    • |
    • (?:[6-9][05]|1[01][05])比赛从60-115脚背5
    • (?:AA?|[BC]|DD?|[E-I])匹配AA、A、B、C DD、D或范围E-I
    • |
    • [A-I](?:[6-9][05]|1[01][05])以5为步长匹配范围a-I和数字60-115
    • |
    • (?:[68]|1[02468]|2[0246])从6-26开始按2步匹配
    • (?:AA?|[BC]|DD?|[E-I])匹配AA、A、B、C、DD、D或范围E-I
  • )闭合交替
  • $字符串结束

Regex演示

const pattern = /^(?:(?:28|3[02468]|4[02468])(?:AA?|[BC]|D{1,4}|[E-I])|(?:[6-9][05]|1[01][05])(?:AA?|[BC]|DD?|[E-I])|[A-I](?:[6-9][05]|1[01][05])|(?:[68]|1[02468]|2[0246])(?:AA?|[BC]|DD?|[E-I]))$/;
const str = `28A
28AA
30B
34AA
36DDDD
D70
I115
A70
H80
6AA
26I
`;
str.split('n').forEach(s => {
if (pattern.test(s)) {
console.log(`Match: ${s}`);
let vol = s.match(/d+/)[0];
let band = s.match(/[A-Z]+/)[0];
console.log(`vol: ${vol}`);
console.log(`band: ${band}`);
console.log("---------------------------------------");
}
})

^(((([0-4])(0|2|4|6|8))|(6|8))|(((6|7|8|9)(0|5))|(1[01][05])))((AAA)|(AA)|(DD)|(DDD)|(HH)|(HHH)|[A-I])$

证明所有有效尺寸匹配,而所有100_464样本无效尺寸不匹配:

const validNumbers = Array
.from({ length: 22 }, (_, i) => 6 + (i * 2))
.concat(Array.from({ length: 12 }, (_, i) => 60 + (i * 5)));

const validLetters = [
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'AAA', 'AA', 'DD', 'DDD', 'HH', 'HHH'
];
const validSizes = validNumbers.map((number) => validLetters
.map((letter) => number + letter))
.flat();
const invalidNumbers = Array
.from({ length: 1_000 }, (_, i) => i)
.filter((n) => !validNumbers.includes(n))
const invalidLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('')
.map((letter) => Array.from({ length: 4 }, (_, i) => letter.repeat(i + 1)))
.flat();
const invalidSizes = invalidNumbers.map((number) => invalidLetters
.map((letter) => number + letter))
.flat();
const regex = /^(((([0-4])(0|2|4|6|8))|(6|8))|(((6|7|8|9)(0|5))|(1[01][05])))((AAA)|(AA)|(DD)|(DDD)|(HH)|(HHH)|[A-I])$/;
const falsePositives = invalidSizes.filter((size) => regex.test(size));
console.log({ falsePositives });
console.log({ validSizes: validSizes.map((size) => ({ size, isValid: regex.test(size) })) });

最新更新