Нужно ли экранировать эту строку RegExp?

Я пытался использовать RegExp, чтобы позже вставить строковую переменную. Но даже эта первая попытка без указанной переменной не сработает. Чего не хватает?

Есть хороший связанный jsbin, который показывает поведение.

const DOCS = [
    "My Report – March 2019.pdf",
    "My Report – May 2019.pdf",
    "My Diary - April-May 2019.pdf",
    "My Diary - February-March 2019.pdf"
]

const title_month_year = new RegExp("(.*) - (January|February|March|April|May|June|July|August|September|October|November|December) (19|20\d{2})")


DOCS.forEach(
    mag = mag.replace(/–/g, "-");
//  if (title_month_year.test(mag)) {   <--- does not match
    if (/(.*) - (January|February|March|April|May|June|July|August|September|October|November|December) (19|20\d{2})/.test(mag)) {
        console.info('we have a match');   
    }

https://jsbin.com/lomolew/edit?js,консоль

Вы используете другой вид рекламы vs -

The fourth bird 28.05.2019 20:55

Хороший улов @Thefourthbird - mdash vs ndash

circusdei 28.05.2019 20:56

Хорошо, думаю, я заслужил -1 за то, что не включил больше кода во вставленный текст, но исправление m-dash присутствовало в jsbin, и код там все еще не совпадает.

dwilbank 28.05.2019 21:01

Не мой отрицательный голос, но причина, по которой вы получаете только 2 совпадения, заключается в том, что третья и четвертая строки содержат 2 месяца с дефисом между ними April-May, и это не соответствует шаблону.

The fourth bird 28.05.2019 21:03

Да, на данном этапе я хочу сопоставить только 2 из 4. Выяснение этого RegExp поможет намного проще сопоставить строки с двойным месяцем (позже).

dwilbank 28.05.2019 21:04

Но какой именно вопрос прямо сейчас?

The fourth bird 28.05.2019 21:17

Я не получал совпадений, потому что \d не был экранирован. Получил ответ - спасибо!

dwilbank 28.05.2019 21:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
49
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Как уже указала четвертая птица, вы используете другой тип рекламы. Что вы можете сделать, так это настроить регулярное выражение так, чтобы оно включало оба типа дефисов: const title_month_year = new RegExp("(.*) (-|–) (January|February|March|April|May|June|July|August|September|October|November|December) (19|20\d{2})")

Обратите внимание, что с решением ваши значения группировки будут отключены на единицу после первой записи (таким образом, вместо 3 элементов у вас теперь есть 4, первый — это то, что находится перед дефисом, второй — это тип дефиса, третий — это месяц, а четвертый год.

Или просто искать символ вместо hypen: const title_month_year = new RegExp("(.*) . (January|February|March|April|May|June|July|August|September|October|November|December) (19|20\d{2})")

Ответ принят как подходящий

Вы забыли экранировать \d{2}

это должно быть \\d{2} внутри строки RegExp.

const DOCS = [
    "My Report – March 2019.pdf",
    "My Report – May 2019.pdf",
    "My Diary - April-May 2019.pdf",
    "My Diary - February-March 2019.pdf"
]

const months = {
    "January": "01",
    "Jan": "01",
    "February": "02",
    "Feb": "02",
    "March": "03",
    "Mar": "03",
    "April": "04",
    "Apr": "04",
    "May": "05",
    "June": "06",
    "Jun": "06",
    "July": "07",
    "Jul": "07",
    "August": "08",
    "Aug": "08",
    "September": "09",
    "Sep": "09",
    "October": "10",
    "Oct": "10",
    "November": "11",
    "Nov": "11",
    "December": "12",
    "Dec": "12"
}


let docsCopy = DOCS.map(m => {
    var mReplace = m.replace(/^(.+)(?:\s[-–]\s)+(.+)\s(\d+)(.+)/, (match, p1, p2, p3, p4) => {

        var p2C = p2.split('-').map(item=>{
            return months[item]
        }).join('-')
        console.info(p2C)
        return p1 + ' ' + p3 + '-' + p2C + p4

    })

    return mReplace



});

console.info(docsCopy)

Спасибо - видел один или два трюка с регулярными выражениями, которые я могу использовать! Фактический сценарий должен обрабатывать, возможно, 5-6 форматов даты, поэтому я вынужден использовать более простое регулярное выражение для обработки каждого формата по одному.

dwilbank 30.05.2019 15:52

Если не фиксированный формат (подключение 1-2 месяца), вы можете захватить только строку, откройте свой разум

Phil.hsu 11.06.2019 08:19

Другие вопросы по теме