【问题标题】:Using switch statement to evaluate regex in javascript使用 switch 语句来评估 javascript 中的正则表达式
【发布时间】:2011-10-25 17:49:45
【问题描述】:

我正在尝试将我的 if 语句管理为 switch 语句来评估正则表达式,但我不知道该怎么做。我尝试了很多可能性,但做不到。看下面的代码,对吗?:

var username = $('input.username'),
    phone = $('input.phone'),
    numRegex = /^[0-9]/i,
    alphaRegex = /^[a-zA-Z]/i,
    usernameVal = username.val(),
    phoneVal = phone.val();

switch (phoneVal) {

  case numRegex.test(phoneVal):
    console.log('Only digits please.');
    break;

  default:
    console.log('It\'s all good.');

}

非常感谢。

【问题讨论】:

  • 只要这些变量在switch (false) {范围内
  • 我相信 switch 只允许测试一个条件
  • 为什么您要构建自己的验证方案,而您可以通过 jQuery validation 之类的方式轻松完成
  • @Emmanuel N:因为这是我公司想要的。
  • 但是您想检查测试是否返回true 或false,而不是将它们的返回值(true 或false)与phoneVal 进行比较。这不是使用switch 的方式。看来您需要一个ifs 链(一个if、很多else ifs 和一个else)。

标签: javascript jquery regex switch-statement


【解决方案1】:

我认为这违背了switch 语句在case 语句中具有条件的观点。它的目的是在给定单个输入的情况下测试多个输出。

如果 JavaScript 在 switch..case 中支持多个输入(或数组中的 destructuring),我可能会看到如下内容:

switch (numRegex.test(phoneVal), alphaRegex.test(usernameVal)) {
    case false, false:
        console.log('Neither are valid.');
        break;

    case true, false:
        console.log('Invalid username.');
        break;

    /* snip */

    default:
        console.log('All\'s good.');
}

但是,在这种情况下,我想说坚持使用if..else 是一个更好、更容易理解/理解的选项:

if (numRegex.test(phoneVal)) {
    console.log('Only digits please.');
    return false;
} else if (alphaRegex.test(usernameVal)) {
    console.log('Only alpha-numeric please.');
    return false;
} else {
    console.log('It\'s all good.');
    return true;
}

【讨论】:

  • 但是有些语言在 switch 中接受多个表达式,但不接受 javascript...!!?我想我必须到处使用if。无论如何感谢您的回答。
【解决方案2】:

如果您只使用每个正则表达式一次,为什么不将其重构为三元组?

可能是这样的:

/^\S/.test($('#name').val()) !== true
? invalidEls.push('name:invalid')
: invalidEls.push('name:valid');

$('#phone').val().match(/^(1-?)?([2-9]\d{2}|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/)
? invalidEls.push('phone:valid')
: invalidEls.push('phone:invalid');

$('#email').val().match(/[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9]){1,}?/)
? invalidEls.push('email:valid')
: invalidEls.push('email:invalid');

【讨论】:

    【解决方案3】:

    另一个类似的模式;

    try {
        if (!alphaRegex.test(usernameVal))
            throw ('Only letters please.');
    
        if (!numRegex.test(phoneVal))
             throw ('Only digits please.');
    
        ...
        return true;
    } catch (e) {
        console.log(e);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多