2013-03-20 5 views
1

Я уверен, что это просто, и я просто не вижу его. Я искал примеры и был настолько коротким и простым, насколько мне кажется, я не могу найти свою проблему.Javascript issue: regex issue find matches

Я хочу проверить поле Почтовый индекс и использовать формат почтового индекса Канады. Я нашел выражение, которое я хотел бы использовать, и это выглядит следующим образом:

var validZIP={ 
    "US":"^\d{5}([\-]?\d{4})?$", 
    "UK":"^(GIR|[A-Z]\d[A-Z\d]??|[A-Z]{2}\d[A-Z\d]??)[ ]??(\d[A-Z]{2})$", 
    "CA":"^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$" 
} 

Пожалуйста, обратите внимание на CA которая выступает за КАНАДУ в этом случае.

Моя onChange функция вызывает следующий метод (OnChange класс checkValidPostal(this) от входа):

function checkValidPostal(input) 
{ 
    var re = new RegExp(validZIP["CA"]); 
    var value = input.value.toUpperCase(); 
    if (value.match(re)) 
    { 
     input.value = value; 
     return true;  
    } 
    input.value = ""; 
    return false; 
} 

Я проверил RegEx линию с помощью:

http://www.regular-expressions.info/javascriptexample.html и он прекрасно работает на этой странице, но для почему-то я не могу заставить его работать на моем!

Пожалуйста, помогите.

+0

что вы переходящая в качестве входных данных? –

+0

Почему вы используете 'match', а не' test'? –

+0

Я передавал такие значения, как: m5m5m5 или M2M2M2 ... и т. Д. Я использовал некоторые инструкции console.log для проверки того, что тест выполняется, и значения проходят, но тест возвращает false. – NEW2WEB

ответ

4

Есть проблема: поскольку вы используете строки вместо regex literals, вам не хватает некоторых спуска.

Кроме того, вы, вероятно, захотите использовать test вместо соответствия.

Вы можете исправить это так:

var validZIP={ 
    "US": /^\d{5}([\-]?\d{4})?$/, 
    "UK": /^(GIR|[A-Z]\d[A-Z\d]??|[A-Z]{2}\d[A-Z\d]??)[ ]??(\d[A-Z]{2})$/, 
    "CA": /^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$/ 
} 

function checkValidPostal(input) { 
    var re = validZIP["CA"]; 
    var value = input.value.toUpperCase(); 
    if (re.test(value)) { 
     input.value = value; 
     return true;  
    } 
    input.value = ""; 
    return false; 
} 
+0

Я собирался упомянуть использование 'RegExp # test' над' String # match'. Вы можете видеть, что это работает на http: //codepen.io/bbuck/pen/cBkou –

2

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

+0

вы говорите, что я должен изменить:' "CA": "^ ([ABCEGHJKLMNPRSTVXY] \ d [ABCEGHJKLMNPRSTVWXYZ]) \ {0,1} (\ d [ABCEGHJKLMNPRSTVWXYZ] \ d) $" 'для этого:' "CA ":"^([ABCEGHJKLMNPRSTVXY] \\ d [ABCEGHJKLMNPRSTVWXYZ]) \\ {0,1} (\\ d [ABCEGHJKLMNPRSTVWXYZ] \\ d) $ "'? – NEW2WEB

+0

Вы правы! Это была проблема все время. Я буду удалять цитаты из строк регулярных выражений в массиве. Большое спасибо Bill! – NEW2WEB

0

Попробуйте положить шаблон вместо строк в validZIP:

var validZIP={ 
    "US":/^\d{5}([\-]?\d{4})?$/, 
    "UK":/^(GIR|[A-Z]\d[A-Z\d]??|[A-Z]{2}\d[A-Z\d]??)[ ]??(\d[A-Z]{2})$/, 
    "CA":/^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$/ 
}