Помогите мне создать регулярное выражение

#javascript #regex

#javascript #регулярное выражение

Вопрос:

Форматировать дату: MMM D[,] YYYY

[,] — необязательная запятая и может содержать некоторый пробел. Пример:

 Nov 12,     2000 - true
Nov 12 2000 - true
Nov 12, 2000 - true
Nov      12,    2000 true
  

Мое регулярное выражение: /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) *(d{1,2}),? *(d{4})$/
Но если значение — март 2010, все, если true

Моя функция для проверки значения

 function checkDateWithStringMonth1(value) {
        //reset
        resetDate();
        //set min and max date
        var minYear = 1900;
        //var maxYear = (new Date()).getFullYear();
        // regular expression to match required date format
        re = /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) *(d{1,2}),? *(d{4})$/;
        //check correct
        if (value != '') {
            if (regs = value.match(re)) {
               if (regs[2] < 1 || regs[2] > 31) {
                    return false;
                }
                if(regs[3] < minYear){return false;}
            } else { return false; }
        } else { return false; }
        //assign

        return true;        
    }
  

Комментарии:

1. Я не эксперт в JS, но разве нет функции, которая может преобразовывать строки даты в объекты даты?

2. Я не уверен, в чем вопрос. Вы хотите сказать, что если дать этому строку ‘March 2010’, возвращается true ?

3. Mar 12,2010 Допустимо? (без пробела после запятой)

Ответ №1:

 /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)s (d{1,2}),?s (d{4})$/
  

Отличия от вашего оригинала:

  • s вместо [пробел] для обработки различных видов пробелов
  • вместо * : * означает 0 или более, вы хотите 1 или более
  • Не нужно экранировать , .

Редактировать: Для размещения дат без пробела после запятой:

 /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)s (d{1,2})(?:,|s)s*(d{4})$/
  
  • (?: статистика группы без захвата.
  • (?:,|s)s* : Разрешите использовать запятую или символ пробела, а затем, возможно, больше пробелов.

Тест:

 var dates = ["Nov 12,     2000", "Nov 12 2000", "Nov 12, 2000", "Nov      12,    2000", "Nov 12,2000"],
    regex = /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)s (d{1,2})(?:,|s)s*(d{4})$/;

dates.map(function (d) { return regex.test(d); });
// => [true, true, true, true, true]
  

Комментарии:

1. но 12 марта 2010 года допустимо. нужны изменения.

2. обязательно должен быть один разделитель

3. Второе регулярное выражение допустимо для всех ваших примеров.

Ответ №2:

Если я правильно помню, вам не нужно экранировать запятые. Это может помочь. и вместо использования пробелов вы можете захотеть использовать символ пробела s , который будет обнаруживать пробелы, новые строки и табуляции (хотя новые строки могут к вам не относиться).

Комментарии:

1. какой символ говорит, что один или несколько? * — ноль или больше; ? — ноль или единица; какой символ говорит об одном или нескольких?

2. символ будет соответствовать одному или нескольким предыдущим символам