JS+WDIO字符串校验函数异常求助:无法正确校验三类字符串
修复JS+WDIO字符串校验函数的问题
我需要校验字符串的三种场景:
- 字符串仅包含数字:长度需在3-14之间
- 字符串仅包含字母:需等于"n/a"
- 字符串同时包含数字和字母:长度需在10-17之间
但我用JS+WDIO写的checkNumber函数无法正常工作,代码如下:
async function checkNumber() { const string = (await homepage.getStringText()).slice(15); expect(await homepage.getStringText()).not.equal("unknown"); if (string.match(/[0-9]/) != null) { expect(string.length).be.greaterThanOrEqual(3); expect(string.length).be.lessThanOrEqual(14); } if (string.match(/[A-Z, a-z]/) != null) { expect(string).equal("n/a"); } if (string.match(/[A-Z, a-z] + [0-9]/) != null) { expect(string.length).be.greaterThanOrEqual(10); expect(string.length).be.lessThanOrEqual(17); } }
原函数的问题分析
- 重复获取文本且逻辑顺序错误:先截取字符串再判断原文本是否为"unknown",既浪费资源,也可能出现截取后原文本状态变化的不一致问题。
- 正则表达式失效:
- 仅字母校验的正则
/[A-Z, a-z]/包含多余逗号,且只能判断"存在字母",无法确保"仅含字母"; - 混合字符校验的正则
/[A-Z, a-z] + [0-9]/有多余空格,只能匹配"字母+数字"的片段,无法判断整个字符串同时包含两类字符。
- 仅字母校验的正则
- 条件未互斥:如果字符串同时含数字和字母,会触发第一个和第三个if分支,导致冲突的断言逻辑。
- 断言逻辑不匹配需求:仅字母场景的断言是判断等于"n/a",但原正则无法确保字符串仅含字母,会导致误判。
修复后的代码
async function checkNumber() { // 一次性获取原文本,避免重复调用 const originalText = await homepage.getStringText(); expect(originalText).not.equal("unknown"); const string = originalText.slice(15); // 定义精准匹配的正则表达式 const onlyDigits = /^[0-9]+$/; const onlyLetters = /^[A-Za-z]+$/; const hasBothLettersAndDigits = /(?=.*[A-Za-z])(?=.*[0-9])^[A-Za-z0-9]+$/; if (onlyDigits.test(string)) { expect(string.length).to.be.greaterThanOrEqual(3); expect(string.length).to.be.lessThanOrEqual(14); } else if (onlyLetters.test(string)) { expect(string).to.equal("n/a"); } else if (hasBothLettersAndDigits.test(string)) { expect(string.length).to.be.greaterThanOrEqual(10); expect(string.length).to.be.lessThanOrEqual(17); } else { // 可选:抛出错误明确非法场景,便于调试 throw new Error(`字符串不符合校验规则:${string}`); } }
修复说明
- 优化文本获取逻辑:先获取一次原文本完成合法性判断,再处理截取后的字符串,提升效率且避免状态不一致。
- 修正正则规则:
^[0-9]+$:确保整个字符串仅由数字组成;^[A-Za-z]+$:确保整个字符串仅由字母组成;(?=.*[A-Za-z])(?=.*[0-9])^[A-Za-z0-9]+$:用正向预查确保字符串同时包含字母和数字,且仅由这两类字符组成。
- 互斥条件判断:用
else if确保同一字符串只会进入一个校验分支,避免冲突断言。 - 增加非法分支处理:可选抛出错误,明确不符合规则的情况,快速定位问题。
内容的提问来源于stack exchange,提问作者Phenom2405
相关产品推荐
相关产品推荐

