You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

原函数的问题分析

  1. 重复获取文本且逻辑顺序错误:先截取字符串再判断原文本是否为"unknown",既浪费资源,也可能出现截取后原文本状态变化的不一致问题。
  2. 正则表达式失效:
    • 仅字母校验的正则/[A-Z, a-z]/包含多余逗号,且只能判断"存在字母",无法确保"仅含字母";
    • 混合字符校验的正则/[A-Z, a-z] + [0-9]/有多余空格,只能匹配"字母+数字"的片段,无法判断整个字符串同时包含两类字符。
  3. 条件未互斥:如果字符串同时含数字和字母,会触发第一个和第三个if分支,导致冲突的断言逻辑。
  4. 断言逻辑不匹配需求:仅字母场景的断言是判断等于"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:45:06