簡體   English   中英

使用 RegExp 驗證胸罩尺寸(美國、歐盟、日本、澳大利亞)

[英]Bra size validation with RegExp (US, EU, Japan, Australia)

我想檢查輸入是否是有效的胸罩測量值。 在美國,胸罩尺寸用偶數 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.) { //一些代碼

} else { 錯誤信息" }```

如何縮短它並使用正則表達式執行上述操作?

替代方案有點長,但是如果缺少某些內容或匹配太多,您可以輕松調整范圍。

您可以首先使用test檢查模式是否匹配。 要獲得樂隊和 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}|[EI])匹配 AA、A、B、C、D 或范圍 EI 的 1-4 次
    • | 或者
    • (?:[6-9][05]|1[01][05])匹配 60 - 115 個腳背,共 5 個
    • (?:AA?|[BC]|DD?|[EI])匹配 AA、A、B、C DD、D 或范圍 EI
    • | 或者
    • [AI](?:[6-9][05]|1[01][05])以 5 為步長匹配范圍 AI 和數字 60 - 115
    • | 或者
    • (?:[68]|1[02468]|2[0246])以 2 為步長匹配 6 - 26
    • (?:AA?|[BC]|DD?|[EI])匹配 AA、A、B、C、DD、D 或范圍 EI
  • )關閉交替
  • $字符串結尾

正則表達式演示

 const pattern = /^(?:(?:28|3[02468]|4[02468])(?:AA?|[BC]|D{1,4}|[EI])|(?:[6-9][05]|1[01][05])(?:AA?|[BC]|DD?|[EI])|[AI](?:[6-9][05]|1[01][05])|(?:[68]|1[02468]|2[0246])(?:AA?|[BC]|DD?|[EI]))$/; 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(/[AZ]+/)[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)|[AI])$/; const falsePositives = invalidSizes.filter((size) => regex.test(size)); console.log({ falsePositives }); console.log({ validSizes: validSizes.map((size) => ({ size, isValid: regex.test(size) })) });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM