Использование оператора switch для оценки регулярных выражений в javascript - PullRequest
1 голос
/ 25 октября 2011

Я пытаюсь преобразовать свои 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 ]

4 голосов
/ 25 октября 2011

Я думаю, что этот тип побеждает точку в выражении switch, имеющем условия в выражениях case.Он предназначен для тестирования нескольких выходов при одном входе.

Возможно, если JavaScript поддерживал несколько входов (или деструктурирование массивов) в switch..case, я мог видеть что-то вроде этого:

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;
}
0 голосов
/ 25 октября 2011

Еще одна похожая картина;

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

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

    ...
    return true;
} catch (e) {
    console.log(e);
}
0 голосов
/ 25 октября 2011

Если вы используете каждое регулярное выражение только один раз, почему бы просто не преобразовать это в блок троичных файлов?

Может быть, что-то вроде этого:

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