2015-10-05 3 views
-5

Я пытаюсь извлечь дату месяца и год (если есть) из строки через регулярные выражения в JS. Моя строка ввода может быть похожа на «Я иду домой 13 апреля» или «Я иду домой 13 апреля» или «31 августа 2015 года, я иду домой». Во всех случаях я хочу извлечь дату месяца и Год, чтобы позже Я могу изменить его формат, как DD/MM/YYYY. если года нет, я бы принял нынешний год.javascript regex

Я попытался с регулярным выражением:

> var reg = 
> /\b(?:(?:jan|feb)?r?(?:uary)?|mar(?:ch)?|apr(?:il)?|may|june?|july?|aug(?:ust)?|oct(?:ober)?|(?:sept?|nov|dec)(?:ember)?)\s+\d{1,2}/ig 

но это соответствует только 13 апреля, как я могу соответствовать 13 апреля или 13 апреля, а также разделить месяц и дату, так что я могу впоследствии преобразовать его в формат DD/MM/YYYY.

Here - это скрипка. Thanks

+0

люди, которые обсудили вопросы, любезно дайте мне знать ответ, если вы можете помочь, тогда нет необходимости t o downvote, я сделал исследование по этому поводу и скрипку, которую вы можете видеть, в одном случае я смог получить. Его легко пропустить и двигаться дальше. Люди публикуют в stackoverflow, когда они не получают решения. – Bhupendra

+0

dont downvote является анонимным, сначала оставьте комментарий здесь и объясните мне, почему его неправильный вопрос – Bhupendra

ответ

0

это регулярное выражение работы:

/\b\s*(\d*)\s*(?:st|th|nd)*\s* (?:(?:jan|feb)?r?(?:uary)?|mar(?:ch)?|apr(?:il)?|may|june?|july?|aug(?:ust)?|oct(?:ober)?|(?:sept?|nov|dec)(?:ember)?)\s*(\d*)(?:st|th|nd)*\s* (\d*)/ig 

here является скрипкой

0

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

В принципе, вы хотите найти либо (month) (day), либо (day)(st|th) (month), а затем необязательный (year).

Это становится:

((month) (day))|((day)(st|th) (month)()?(year)?) 

Подставит [0-9]+ за день и год, и, наконец, [a-zA-Z]+ за месяц, чтобы сохранить его простым.

(([a-zA-Z]+) ([0-9]+))|(([0-9]+)(st|th) ([a-zA-Z]+)()?([0-9]+)?) 

Это также соответствует либо st или th и возможное пространство до года. Таким образом, делая, что не-захват путем применения оператора группы без захвата (?:), он становится:

(([a-zA-Z]+) ([0-9]+))|(([0-9]+)(?:st|th) ([a-zA-Z]+)(?:)?([0-9]+)?) 

var re = /(([a-zA-Z]+) ([0-9]+))|(([0-9]+)(?:st|th) ([a-zA-Z]+)(?:)?([0-9]+)?)/; 
var str = '31st August 2015'; 
var matches; 

if ((matches = re.exec(str)) !== null) { 
    if (matches .index === re.lastIndex) { 
     re.lastIndex++; 
    } 

    console.log(matches); 
    // Use matches[i] to access the matches 
} 
+0

привет, Tim, моя строка ввода может содержать что-то вроде «Мой полет на 3-м месте» или «Я подал заявление для 4-го декабря "или" 3 декабря я в отпуске ". Поэтому мне нужно сопоставить, если его действительный месяц {dec/december} затем получает свою дату от суффикса и префикса от имени месяца. Я прикрепил скрипку выше, где я могу соответствовать 13 апреля. – Bhupendra

+0

@Bhupendra Это на самом деле то, что я имел в виду под * логикой в ​​коде *. Поскольку включение этого в регулярное выражение легко затруднит его поддержание. Вы можете получить месяц из совпадений и обработать это с помощью какого-либо JavaScript или, возможно, другого регулярного выражения: '(Jan | Feb | Etc) | (January | February | Etcetc)' с модификатором, нечувствительным к регистру. – Tim

+0

спасибо tim Я смог создать genry regex – Bhupendra