2013-11-21 3 views
1

Ive работало над этим регулярным выражением в течение нескольких дней, и я не могу понять. Он либо передает все, что я там вставляю, либо выкидывает все, и я не могу заставить его функционировать. По общему признанию, я новичок в этом комплексе вещей с Javascript, так что может быть, вы действительно не можете это сделать.Regex не соответствует должным образом

Я хочу проверить onkeypress, что было введено во вход, а затем проверить его на x, y или z. Затем оттуда отправляйте его по своему пути, чтобы делать другие аккуратные вещи.

Итак, вопрос в том, что я не понимаю о RegExp?

Для этого используется FIDDLE.

function val() { 
    var gradeIn = document.querySelectorAll("#letGrade input[type=text]"); 
    var checkGrade = new RegExp(/[xyz]/gi); 
    for (var i = 0; i < gradeIn.length; i++) { 
     if (!checkGrade.test(gradeIn.value)) { 
      alert ("This must be X, Y, or Z"); 
      return false; 
     } else { 
      return true; 
     } 
    } 
}; 

EDIT/UPDATE: Я пытался сделать это при нажатии клавиш и проверки каждого ввода текста individualy однако это действительно своего рода болотистый в великой схеме вещей, и не работает точно правильно. Я решил проверить все текстовые входы onsubmit и все сразу все. Обновленный код приведен ниже.

function calcGPA() { 
    var grades = document.querySelectorAll("#letGrade input[type=text]"); 
    var contacts = document.querySelectorAll("#conHours input[type=text]"); 
    var gVals = []; 
    var cVals = []; 
    var failGrade = "The Letter Grade input may only be A, B, C, D or F"; 
    var failHours = "The Contact Hours input may only be 1, 2, 3, 4 or 5"; 
    var checkGrade = /^[ABCDF]/; 
    var checkhours = /^[12345]/; 

    for (var i = 0; i < grades.length; i++) { 
     if (!checkGrade.test(grades[i].value)) { 
      alert(failGrade); 
      return false; 
     } 
     if (!checkhours.test(contacts[i].value)) { 
      alert(failHours); 
      return false; 
     } 
     gVals.push(grades[i].value); 
     cVals.push(contacts[i].value); 
    } 
    //Other cool stuff happens here 
}; 

Теперь просто закончить конверсионный кусок для букв цифр и математической части. Благодарим вас за помощь!

+0

регулярное_выражение конструктор принимает строку и флаги разделены запятой – 1252748

ответ

2

Проблема не только в вашем регулярном выражении.

if (!checkGrade.test(gradeIn[i].value)) { 

Вы не проверяли каждый класс. Теперь, если вы хотите, чтобы был только, это символы, вам нужно немного расширить регулярное выражение. Кроме того, нет смысла вызывать new RegExp, если вы используете собственный синтаксис.

var checkGrade = /^[xyz]+$/; 

Это означает, что вы в порядке с полями, похожими на «xxyyz» или «zzy». Если это должно быть просто один символ, который был бы

var checkGrade = /^[xyz]$/; 
+0

я заметил ранее, что он выглядел, когда проблема была, но по какой-то причине он все еще не работает. Я не знаю, делаю ли я что-то неправильное или нет. Я думаю, что цикл for является излишним? Почему я хочу перебирать все входы, когда я проверяю их индивидуально? –

+0

@OtisEugeneAnderson Хорошо, это хороший момент. Вам просто нужна процедура проверки, чтобы работать против ввода, на который влияет нажатие клавиши. – Pointy

+0

Im собираюсь принять ваш ответ, так как это тот, который на самом деле указал мне в правильном направлении. По какой-то причине/^ [xyz]/возвращает желаемый результат, но/^ [xyz] $/нет. Знак $, который я предполагаю, не глядя на него, вызывал остановку проверки после того, как был сделан первый матч, и закончил цикл, следовательно, это не было полностью завершено. Однако я взял $ out, и теперь все работает отлично. Спасибо за вашу помощь по этому поводу. Ill отредактируйте оп, чтобы показать самую последнюю версию кода. –

Смежные вопросы