Я пытался использовать 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');
}
Хороший улов @Thefourthbird - mdash vs ndash
Хорошо, думаю, я заслужил -1 за то, что не включил больше кода во вставленный текст, но исправление m-dash присутствовало в jsbin, и код там все еще не совпадает.
Не мой отрицательный голос, но причина, по которой вы получаете только 2 совпадения, заключается в том, что третья и четвертая строки содержат 2 месяца с дефисом между ними April-May
, и это не соответствует шаблону.
Да, на данном этапе я хочу сопоставить только 2 из 4. Выяснение этого RegExp поможет намного проще сопоставить строки с двойным месяцем (позже).
Но какой именно вопрос прямо сейчас?
Я не получал совпадений, потому что \d не был экранирован. Получил ответ - спасибо!
Как уже указала четвертая птица, вы используете другой тип рекламы.
Что вы можете сделать, так это настроить регулярное выражение так, чтобы оно включало оба типа дефисов:
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 форматов даты, поэтому я вынужден использовать более простое регулярное выражение для обработки каждого формата по одному.
Если не фиксированный формат (подключение 1-2 месяца), вы можете захватить только строку, откройте свой разум
Вы используете другой вид рекламы
–
vs-