Code
// TT.MM.JJJJ mit benannten Gruppen
const DATE_RE = /(?<d>\d{2})\.(?<m>\d{2})\.(?<y>\d{4})/g;
// Alle Treffer mit Gruppen und Index
const findDates = (text) =>
[...text.matchAll(DATE_RE)].map(({ groups, index }) => ({ ...groups, index }));
// Ersetzen per Callback: TT.MM.JJJJ -> JJJJ-MM-TT
const toIsoDates = (text) =>
text.replace(DATE_RE, (_, d, m, y) => `${y}-${m}-${d}`);
// Nutzereingabe als Literal suchen (Sonderzeichen escapen)
const escapeRegex = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
// Callback verhindert, dass $& / $1 im Ersatztext interpretiert werden
const replaceLiteral = (text, search, repl) =>
text.replace(new RegExp(escapeRegex(search), 'gi'), () => repl);
const txt = 'Start 01.03.2024, Ende 15.04.2024 (Preis: 9.99$)';
console.log(findDates(txt));
console.log(toIsoDates(txt));
console.log(replaceLiteral(txt, '9.99$', '12,50 €'));
[
{ d: '01', m: '03', y: '2024', index: 6 },
{ d: '15', m: '04', y: '2024', index: 23 }
]
Start 2024-03-01, Ende 2024-04-15 (Preis: 9.99$)
Start 01.03.2024, Ende 15.04.2024 (Preis: 12,50 €)