2014-09-15 2 views
0

В конце дня мне нужно, чтобы регулярное выражение соответствовало множественным или одиночным вхождениям строки даты.JS Regex: соответствует одному или нескольким событиям

Для одиночного вхождения «12-2-2014» будет использоваться регулярное выражение /(\d+[-/\.]\d+[-/\.]\d+)/.

Для тестирования «12-2-2014 22-05-2033» он потерпит неудачу. С активным глобальным флагом он будет проверяться положительно, но я недавно усвоил, что при использовании глобального флага я не могу выполнить модульное тестирование своих регулярных выражений.

Любая помощь приветствуется ...

EDIT: Я тестирую с QUnit на данный момент. Простой тест будет:

test("REGEX TEST", function() { 
     var dates = ['12-2-2014', '14-5-2014'], 
      regex = /(\d+[-/\.]\d+[-/\.]\d+)/g; 
     ok(regex.test(dates.join(' '))); 
     ok(regex.test(dates.join(' '))); 
     ok(regex.test(dates.join(' '))); 
     ok(regex.test(dates.join(' '))); 
    }); 

-> Я получаю разные результаты для каждой оценки ...

+0

Ну, проблема, кажется, не быть здесь, но в том, что вы делаете ваш модульного тестирования. Вы не можете отказаться использовать флаг g в регулярном выражении только потому, что у вас есть проблема в системе тестирования. –

+0

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

+0

Вы уверены, что не сможете выполнить его тестирование с помощью глобального флага _regex_? Это полностью отличается от глобальных _variables _... – Wrikken

ответ

1

Я посмотрел на ваш другой вопрос, и вот мое решение, которое позволяет сохранить ваши флаг.

test("Date entry should be a Date", function() { 
    ok("10.12.2014".match(/(\d+[-/\.]\d+[-/\.]\d+)/g).length == 1, "Date is not parsed correctly: 10.12.2014"); 
    ok("10-12-2014".match(/(\d+[-/\.]\d+[-/\.]\d+)/g).length == 1, "Date is not parsed correctly: 10-12-2014"); 
    ok("10/12/2014".match(/(\d+[-/\.]\d+[-/\.]\d+)/g).length == 1, "Date is not parsed correctly: 10/12/2014"); 
}); 

Вот несколько тестов я придумал:

test("Invalid dates should be rejected", function() { 
    ok("10#12#2014".match(/(\d+[-/\.]\d+[-/\.]\d+)/g).length == 0, "Date is not parsed correctly: 10#12#2014"); 
    ok("September".match(/(\d+[-/\.]\d+[-/\.]\d+)/g).length == 0, "Date is not parsed correctly: September"); 
}); 


test("Multiple Dates should be found", function() { 
    ok("10.12.2014 11.13.2015".match(/(\d+[-/\.]\d+[-/\.]\d+)/g).length == 2, "Date is not parsed correctly: 10.12.2014 11.13.2015"); 
}); 
+0

Нет, это смущает проблему. Контрольный блок должен проверить свой код, а не его регулярное выражение. –

+0

Уверены ли вы, что у вас это было проверено? Поскольку объект String имеет метод 'match()' ... –

+0

Конечно, я не тестирую свои ответы SO :) Я обновил его. –

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