[英]how to do a regexp validation for us phone number not to begin with 0 or 1?
[英]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 匹配,一種選擇是從匹配中提取數字或大寫字符,因為有匹配,例如90C
和C90
^(?:(?: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.