Замените все, кроме соответствующего шаблона в регулярном выражении

#javascript #regex

Вопрос:

Я пытаюсь удалить все, кроме соответствующего шаблона, используя .replace() функцию javascripts и регулярное выражение.

Я хочу сохранить цифры из поля «дата», т. е. 11 10 2021 или 9 10 2021. Это регулярное /[d]{1,2} [0-9]{2} [0-9]{4}/g выражение соответствует шаблонам дат, однако при использовании .replace(regex, '') оно заменяет эти цифры, а не сохраняет их. Мне просто интересно, как «перевернуть» шаблон, чтобы сохранить цифры и заменить все остальное.

Примеры строк:

 SURVEY API RESULT LANDING: [{"_id":"616392e41a03eed562de2e8a",
"userId":"email@gmail.com",
"date":"11 10 2021",
"timeStamp":"2:26:",
"formResponse":"Survey completed"}]
    
[{"_id":"616392e41a03eed562de2e8a",
"userId":"email@gmail.com",
"date":"9 10 2021",
"timeStamp":"2:26:",
"formResponse":"Survey completed"}]
 

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

1. Похоже, было бы намного проще просто разобрать JSON и извлечь date поля.

2. Я бы сделал это, если бы мог — это скорее упражнение в регулярном выражении, чем что-либо еще

3. Почему бы просто не использовать результат String.prototype.match(regex) ?

Ответ №1:

Чтобы найти одну дату, попробуйте выполнить следующие действия

 `[{"_id":"616392e41a03eed562de2e8a",
"userId":"email@gmail.com",
"date":"9 10 2021",
"timeStamp":"2:26:",
"formResponse":"Survey completed"}]`.replace(/.*([d]{1,2} [0-9]{2} [0-9]{4}).*/gms, "$1");
 

Ссылка на регулярное выражение https://javascript.info/regexp-introduction

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

1. Спасибо! Я согласился с этим, но добавил»? «после первого»*», так как первая цифра многозначной даты отсекалась. Таким образом, полученное регулярное выражение является: /.*?([d]{1,2} [0-9]{2} [0-9]{4}).*/g

2. Пока вам нужно только соответствовать 1, это работает, хотя, как предположил @MrMythical, str.match(/[d]{1,2} [/d]{2} [/d]{4}/)?.[0]; в этом случае было бы более прямолинейно. Вместо сопоставления полной строки и использования группы захвата.

Ответ №2:

Используйте регулярное выражение exec или строку matchAll вместо замены строки

выполнение

 const regex = /[d]{1,2} [d]{2} [d]{4}/g;
const str = `SURVEY API RESULT LANDING: [{"_id":"616392e41a03eed562de2e8a",
"userId":"email@gmail.com",
"date":"11 10 2021",
"timeStamp":"2:26:",
"formResponse":"Survey completed"}]
    
[{"_id":"616392e41a03eed562de2e8a",
"userId":"email@gmail.com",
"date":"9 10 2021",
"timeStamp":"2:26:",
"formResponse":"Survey completed"}]`;

let match;

while(match = regex.exec(str)) {
    console.log(match[0]);
} 

Матчалл

 const iterator = `SURVEY API RESULT LANDING: [{"_id":"616392e41a03eed562de2e8a",
"userId":"email@gmail.com",
"date":"12 10 2021",
"timeStamp":"2:26:",
"formResponse":"Survey completed"}]
    
[{"_id":"616392e41a03eed562de2e8a",
"userId":"email@gmail.com",
"date":"9 10 2021",
"timeStamp":"2:26:",
"formResponse":"Survey completed"}]`.matchAll(/[d]{1,2} [d]{2} [d]{4}/g);

console.log(Array.from(iterator).map(m => m[0]));