使用switch语句来评估javascript中的正则表达式

时间:2011-10-25 17:49:45

标签: javascript jquery regex switch-statement

我正在尝试将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.');

}

非常感谢。

3 个答案:

答案 0 :(得分:4)

我认为这种情况违背了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;
}

答案 1 :(得分:0)

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

也许是这样的:

/^\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');

答案 2 :(得分:0)

另一种类似的模式;

try {
    if (!alphaRegex.test(usernameVal))
        throw ('Only letters please.');

    if (!numRegex.test(phoneVal))
         throw ('Only digits please.');

    ...
    return true;
} catch (e) {
    console.log(e);
}