Проверка даты в форме с использованием регулярного выражения [дубликат]

В то время как , что вызывает NullReferenceExceptions и подходит к avoid / fix , такое исключение было рассмотрено в других ответах, что многие программисты не имеют " t узнал еще, как независимо отлаживать такие исключения во время разработки.

В Visual Studio это обычно легко благодаря Visual Studio Debugger .


Во-первых, убедитесь, что правильная ошибка будет обнаружена - см. . Как разрешить нарушение «Исключение System.NullReferenceException» в VS2010? Примечание1

Затем либо Начать с отладки (F5) , либо Приложить [отладчик VS] к запуску процесса . Иногда может быть полезно использовать Debugger.Break , в котором будет предложено запустить отладчик.

Теперь, когда NullReferenceException выбрано (или необработанно), отладчик остановится ( помните правило, указанное выше?) в строке, на которой произошло исключение. Иногда ошибка может быть легко обнаружена.

Например, в следующей строке единственный код, который может , вызывает исключение, если myString имеет значение null. Это можно проверить, посмотрев окно Watch или выполнив выражения в окне Immediate Window .

var x = myString.Trim();

В более сложных случаях, таких как следуя ниже, вам нужно будет использовать один из методов выше (Watch или Immediate Windows) для проверки выражений, чтобы определить, было ли str1 пустым или если str2 имеет значение null.

var x = str1.Trim() + str2.Trim();

Once , где было выбрано исключение, это обычно тривиально по отношению к разуму назад, чтобы выяснить, где введенное значение null было [неправильно] -

. Найдите время, необходимое для понимания причина исключения. Проверьте нулевые выражения. Проверьте предыдущие выражения, которые могли бы привести к таким нулевым выражениям. Добавьте контрольные точки и, по мере необходимости, пройдите через программу. Используйте отладчик.


1 Если Break on Throws слишком агрессивен и отладчик останавливается на NPE в библиотеке .NET или сторонних разработчиков, Break на User-Unhandled можно использовать для ограничения выловленных исключений. Кроме того, VS2012 представляет Just My Code , который я рекомендую также включить.

Если вы отлаживаете с включенным Just My Code, поведение немного отличается. При включенном Just My Code отладчик игнорирует исключения, связанные с привилегиями обычного языка (CLR) первого шанса, которые выходят за пределы My Code и не проходят через My Code

blockquote>

43
задан Juan Ignacio 28 March 2011 в 22:37
поделиться

11 ответов

Я использую эту функцию для формата dd / mm / yyyy:

// (new Date()).fromString("3/9/2013") : 3 of september
// (new Date()).fromString("3/9/2013", false) : 9 of march
Date.prototype.fromString = function(str, ddmmyyyy) {
    var m = str.match(/(\d+)(-|\/)(\d+)(?:-|\/)(?:(\d+)\s+(\d+):(\d+)(?::(\d+))?(?:\.(\d+))?)?/);
    if(m[2] == "/"){
        if(ddmmyyyy === false)
            return new Date(+m[4], +m[1] - 1, +m[3], m[5] ? +m[5] : 0, m[6] ? +m[6] : 0, m[7] ? +m[7] : 0, m[8] ? +m[8] * 100 : 0);
        return new Date(+m[4], +m[3] - 1, +m[1], m[5] ? +m[5] : 0, m[6] ? +m[6] : 0, m[7] ? +m[7] : 0, m[8] ? +m[8] * 100 : 0);
    }
    return new Date(+m[1], +m[3] - 1, +m[4], m[5] ? +m[5] : 0, m[6] ? +m[6] : 0, m[7] ? +m[7] : 0, m[8] ? +m[8] * 100 : 0);
}
7
ответ дан edid 26 August 2018 в 01:43
поделиться

Для тех, кто должен проверять годы раньше, чем в 1900 году, следуйте за этим фокусом. Фактически это то же самое, что и приведенный выше ответ [@OammieR][1], но с годами, включая 1800 - 1899.

/^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((18|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((18|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/

Надеюсь, это поможет кому-то, кто должен проверять годы до 1900 года, например 01/01/1855, и т. д.

Спасибо @OammieR за исходную идею.

1
ответ дан Anjana Silva 26 August 2018 в 01:43
поделиться

Сделайте следующее изменение в файле jquery.validationengine-en.js и обновите встроенную проверку dd / mm / yyyy, включив високосный год:

"date": {
    // Check if date is valid by leap year
    "func": function (field) {
    //var pattern = new RegExp(/^(\d{4})[\/\-\.](0?[1-9]|1[012])[\/\-\.](0?[1-9]|[12][0-9]|3[01])$/);
    var pattern = new RegExp(/^(0?[1-9]|[12][0-9]|3[01])[\/\-\.](0?[1-9]|1[012])[\/\-\.](\d{4})$/);
    var match = pattern.exec(field.val());
    if (match == null)
    return false;

    //var year = match[1];
    //var month = match[2]*1;
    //var day = match[3]*1;
    var year = match[3];
    var month = match[2]*1;
    var day = match[1]*1;
    var date = new Date(year, month - 1, day); // because months starts from 0.

    return (date.getFullYear() == year && date.getMonth() == (month - 1) && date.getDate() == day);
},
"alertText": "* Invalid date, must be in DD-MM-YYYY format"
0
ответ дан Daniel Olszewski 26 August 2018 в 01:43
поделиться

Регулярное выражение подходит для соответствия общему формату, но я думаю, вам нужно перевести синтаксический анализ на класс Date, например :

function parseDate(str) {
  var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/);
  return (m) ? new Date(m[3], m[2]-1, m[1]) : null;
}

Теперь вы можете использовать эту функцию для проверки допустимых дат; однако, если вам необходимо выполнить проверку подлинности без катания (например, «31/2/2010» автоматически не перевернется к «3/3/2010»), то у вас есть еще одна проблема.

[Изменить ] Если вы также хотите выполнить проверку без катания, вы можете добавить проверку для сравнения с исходной строкой, чтобы убедиться, что она равна той же дате:

function parseDate(str) {
  var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/)
    , d = (m) ? new Date(m[3], m[2]-1, m[1]) : null
    , nonRolling = (d&&(str==[d.getDate(),d.getMonth()+1,d.getFullYear()].join('/')));
  return (nonRolling) ? d : null;
}

[Edit2] Если вы хотите совпадение с нулем (например, «08/08/2013»), вы могли бы сделать что-то вроде этого:

function parseDate(str) {
  function pad(x){return (((''+x).length==2) ? '' : '0') + x; }
  var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/)
    , d = (m) ? new Date(m[3], m[2]-1, m[1]) : null
    , matchesPadded = (d&&(str==[pad(d.getDate()),pad(d.getMonth()+1),d.getFullYear()].join('/')))
    , matchesNonPadded = (d&&(str==[d.getDate(),d.getMonth()+1,d.getFullYear()].join('/')));
  return (matchesPadded || matchesNonPadded) ? d : null;
}

Однако он будет терпеть неудачу для непостоянно заполненных дат (например, «8/08/2013») ).

31
ответ дан maerics 26 August 2018 в 01:43
поделиться

Попробуйте использовать это.

[0-9]{2}[/][0-9]{2}[/][0-9]{4}$

это должно работать с этим шаблоном DD/DD/DDDD, где D - любая цифра (0-9)

3
ответ дан MarmiK 26 August 2018 в 01:43
поделиться

Вы можете взять регулярное выражение, которое будет проверять YYYY / MM / DD и перевернуть его, чтобы получить то, что вам нужно для DD / MM / YYYY:

/^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/

BTW - это регулярное выражение проверяет как DD / MM / YYYY или DD-MM-YYYY

PS Это позволит использовать даты, такие как 31/02/4899

65
ответ дан mVChr 26 August 2018 в 01:43
поделиться

Если вы уже в Javascript, не можете ли вы просто использовать Date.Parse () для проверки даты вместо использования regEx.

RegEx для даты на самом деле громоздкий и труднодоступный, особенно с високосные годы и все.

2
ответ дан Naraen 26 August 2018 в 01:43
поделиться

Взгляните сюда http://forums.asp.net/t/1410702.aspx/1

Используйте следующие данные регулярного выражения, это будет поддерживать прыжок год.

var reg = /^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g;

Пример

29
ответ дан OammieR 26 August 2018 в 01:43
поделиться

Слайс Scape просто используется \ перед /, и он будет экранирован. (\/ => /).

В противном случае вы можете использовать следующее выражение: DD / MM / YYYY:

/^[0-9]{2}[\/]{1}[0-9]{2}[\/]{1}[0-9]{4}$/g

Пояснение :

  • [0-9]: Just Numbers
  • {2} или {4}: длина 2 или 4. Вы можете сделать {2,4} также длину между двумя числами (2 и 4 в этом случае)
  • [\/]: Символ /
  • g: Глобальный - или m: Многострочный (дополнительно, см. Ваши запросы)
  • $: привязка к концу строки. (Необязательно, см. Ваши пожелания)
  • ^: начало строки. (Необязательно, см. Ваши пожелания)

Пример использования:

var regex = /^[0-9]{2}[\/][0-9]{2}[\/][0-9]{4}$/g;

var dates = ["2009-10-09", "2009.10.09", "2009/10/09", "200910-09", "1990/10/09", 
    "2016/0/09", "2017/10/09", "2016/09/09", "20/09/2016", "21/09/2016", "22/09/2016",
    "23/09/2016", "19/09/2016", "18/09/2016", "25/09/2016", "21/09/2018"];

//Iterate array
dates.forEach(
    function(date){
        console.log(date + " matches with regex?");
      console.log(regex.test(date));
    });

Конечно, вы может использоваться как boolean:

if(regex.test(date)){
     //do something
}
4
ответ дан Pau 26 August 2018 в 01:43
поделиться
((?=\d{4})\d{4}|(?=[a-zA-Z]{3})[a-zA-Z]{3}|\d{2})((?=\/)\/|\-)((?=[0-9]{2})[0-9]{2}|(?=[0-9]{1,2})[0-9]{1,2}|[a-zA-Z]{3})((?=\/)\/|\-)((?=[0-9]{4})[0-9]{4}|(?=[0-9]{2})[0-9]{2}|[a-zA-Z]{3})

Скомпилировать Regex на нем

2012/22/Jan
2012/22/12 
2012/22/12
2012/22/12
2012/22/12
2012/22/12
2012/22/12
2012-Dec-22
2012-12-22
23/12/2012
23/12/2012
Dec-22-2012
12-2-2012
23-12-2012
23-12-2012
2
ответ дан user1693371 26 August 2018 в 01:43
поделиться

Я строю это регулярно, чтобы проверить месяц 30/31 и пусть февраль до 29.

new RegExp(/^((0[1-9]|[12][0-9]|3[01])(\/)(0[13578]|1[02]))|((0[1-9]|[12][0-9])(\/)(02))|((0[1-9]|[12][0-9]|3[0])(\/)(0[469]|11))(\/)\d{4}$/)

Я думаю, он более простой и более гибкий и достаточно полный.

Возможно Первая часть может заключаться в контракте, но я не нашел должным образом.

0
ответ дан YannickIngenierie 26 August 2018 в 01:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: