Ошибка регулярного выражения при использовании javascript - PullRequest
0 голосов
/ 03 августа 2020

Я не могу заставить регулярное выражение соответствовать чему-либо в моей функции javascript, и у меня закончились идеи, что не так. Я работал над этим фрагментом для большей части поиска и проверки строк регулярных выражений других людей, и каждая попытка терпит неудачу с m = null. Это должно быть что-то простое ... Я не могу этого видеть.

Строка регулярного выражения, на которой я остановился, проверяется здесь: Пример

Цель функции js - сделать так, чтобы время ввода выводилось за 24 часа. Предупреждения предназначены только для тестирования.

Вот мой javascript код:

//
// Enable a prototype getHours function
//
Date.prototype.addHours= function(h){
   this.setHours(this.getHours()+h);
    return this;
}
        
//
// Input:  string '07/19/2020 08:40 PM'
// Output: date   07/19/2020 20:40
//
function strToDate(dateString){
    try {   
        var dateobject;
        var dateReg = /^(\d{1,2})\/(\d{1,2})\/(\d{4}) (\d{1,2}):(\d{1,2}):(\d{1,2}) ([AP]M)$/;
        var m = dateString.match(dateReg);
        if (m) {
            dateobject = new Date(m[1], m[2]-1, m[3], m[4], m[5], 0)
            if (m[6] == 'PM') {
                dateobject = dateobject.addHours(12)
            }
        } else { 
            alert('no match');             
        }
        return dateObject;
    } catch (ex) {
        alert('error: ' + ex);
    }
}

Мы будем благодарны за любые предложения!

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Ваш код исправлен ниже, ошибки были:

  • Неверный шаблон в регулярном выражении, поскольку вы не пропускаете секунды
  • Неправильный регистр в dateObject имя переменной
  • Неправильный порядок параметров в Date конструкторе

//
// Enable a prototype getHours function
//
Date.prototype.addHours= function(h){
   this.setHours(this.getHours()+h);
    return this;
}
        
//
// Input:  string '07/19/2020 08:40 PM'
// Output: date   07/19/2020 20:40
//
function strToDate(dateString){
    try {   
        var dateObject;
        var dateReg = /^(\d{1,2})\/(\d{1,2})\/(\d{4}) (\d{1,2}):(\d{1,2}) ([AP]M)$/;
        var m = dateString.match(dateReg);
        if (m) {
            dateObject = new Date(m[3], m[1]-1, m[2], m[4], m[5], 0)
            if (m[6] == 'PM') {
                dateObject = dateObject.addHours(12)
            }
        } else { 
            alert('no match');             
        }
        return dateObject;
    } catch (ex) {
        alert('error: ' + ex);
    }
}

console.log(strToDate('07/19/2020 08:40 PM').toLocaleString());
0 голосов
/ 03 августа 2020

Попробуйте изменить строку:

var dateReg = /^(\d{1,2})\/(\d{1,2})\/(\d{4}) (\d{1,2}):(\d{1,2}):(\d{1,2}) ([AP]M)$/;

на:

var dateReg = /^(\d{1,2})\/(\d{1,2})\/(\d{4}) (\d{1,2}):(\d{1,2}) ([AP]M)$/;

В вашем регулярном выражении есть два двоеточия (:), но только одно двоеточие за раз.

Также отсутствует пробел между частью времени и частью AM / PM.

Я проверил это здесь: https://regex101.com/r/szity1/1

...