2012-06-30 3 views
0

Мой код выглядит следующим образомJavaScript матч «матч» оленья кожа

var html = $(el).html().toString(); 
html = '2012-05-10'; 
var re = new RegExp('^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$'); 
var m = re.exec(html); 
if (m != null) 
alert('match'); 
else 
alert('nomatch'); 

Цель регулярного выражения, чтобы проверить, содержит ли строка любые даты. Однако он никогда не находит никаких дат. Я проверил регулярное выражение с помощью онлайн-инструмента regexp.

+2

подобно тому, как предложение: Better матч только за то, что выглядит dateish (например, '## ## #.. ### ') и затем проверьте, действительно ли совпадение является действительной датой (месяц между 1 и 12 и т. д.). Это делает вещи намного проще, и вы действительно можете проверить, например. если данный месяц, например. имеет 31-ю или нет. – ThiefMaster

+0

Вот сайт, который может помочь: http://www.mkyong.com/regular-expressions/how-to-validate-date-with-regular-expression/ – jao

+1

Вам не нужно использовать конструктор при создании шаблона , Они обычно используются, только если ваш шаблон должен ссылаться на переменные. Литеральный '/ pattern /' [лучше для производительности] (https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions). – Utkanos

ответ

1

Если вы пытаетесь найти whether a string contains any dates, то с ^ в начале и $ не собирается помогать - как они обозначают, чтобы соответствовать самому началу и в конце строки.

Чтобы найти дату в пределах строки, содержащей другой текст (или даже пробелы), используйте этот ...

var re = new RegExp('(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])'); 

UPDATE

Антон уже определил решение - однако, хотя вышеприведенное решение лучше n оригинал, это все еще не правильно, так как \d необходимо экранировать (до \\d), чтобы он работал, когда он содержался в кавычках. Так что вместо этого он должен быть ...

var re = new RegExp('(19|20)\\d\\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])'); 

Однако задним числом я согласен со всеми другими, так как это не динамический паттерн, лучшим решением является использование /pattern/ синтаксиса

0

Я сделал, как @Utkanos сказал и использовал/шаблон/-syntax вместо этого, как

if (/(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])/.test(html)) 

Затем он работал :)

+0

Ненавижу сказать, но часть, которая на самом деле «работала», удаляла '^' и '$', а не использование синтаксиса '/ pattern /' ... но рад, что вы его отсортировали. – freefaller

+0

Thing is Я попытался удалить^и $, но это не имело значения. Тогда я попробовал/узор/вместо этого, а затем работал –

+0

О, хорошо, тогда я приношу свои извинения. Так же, как вопрос интереса, * были * вы пытаетесь совместить всю строку в качестве даты или находить дату в более длинной строке? (Кроме того, я только что понял, что если ваш оригинальный шаблон с символами '' 'привел бы к тому, что' \ d' будет рассматриваться как escape-символ ... вам понадобилось бы '\\ d' вместо этого ... это еще одна причина, по которой синтаксис '/ pattern /' работал – freefaller

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