首页 > 解决方案 > 使用 RegExp 验证胸罩尺寸(美国、欧盟、日本、澳大利亚)

问题描述

我想检查输入是否是有效的胸罩测量值。在美国,胸罩尺寸用偶数 28-48 和字母 AI、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];

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

if ((vol > 28 && vol < 48) && band == "AAA" || band == "AA" || band == "A" || band == "B" || etc.) { //一些代码

} 其他 { 错误信息" }```

如何缩短它并使用正则表达式执行上述操作?

标签: javascriptregexvalidation

解决方案


替代方案的模式有点长,但是如果缺少某些内容或匹配太多,您可以轻松调整范围。

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

^(?:(?: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])以 2 为步长匹配 28 - 48
    • (?:AA?|[BC]|D{1,4}|[E-I])匹配 AA、A、B、C、1-4 次 D 或范围 EI
    • |或者
    • (?:[6-9][05]|1[01][05])匹配从 60 - 115 脚背 5
    • (?:AA?|[BC]|DD?|[E-I])匹配 AA、A、B、C DD、D 或范围 EI
    • |或者
    • [A-I](?:[6-9][05]|1[01][05])以 5 为步长匹配范围 AI 和数字 60 - 115
    • |或者
    • (?:[68]|1[02468]|2[0246])以 2 为步长匹配 6 - 26
    • (?:AA?|[BC]|DD?|[E-I])匹配 AA、A、B、C、DD、D 或范围 EI
  • )关闭交替
  • $字符串结束

正则表达式演示

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("---------------------------------------");
  }
})


推荐阅读