在模板字面量中传递正则捕获组为函数参数及日期格式转换问题
Hey there! Let's tackle your two questions one by one, starting with how to pass regex capture groups as function arguments inside template literals, then diving into your date formatting task.
Question 1: Passing Regex Capture Groups as Function Arguments in Template Literals
When using String.prototype.replace() with a callback function, the capture groups from your regex are automatically passed as arguments to that callback (right after the full matched string). Inside the callback, you can directly use these capture group arguments when calling other functions within a template literal—no extra hoops needed.
Here's a quick example to illustrate:
// A helper function to process a capture group value function formatGroup(value) { return `[${value.toUpperCase()}]`; } const originalStr = "My favorite fruit is (apple)"; const fruitRegex = /\((\w+)\)/; // Use replace with a callback; group1 is our capture group const result = originalStr.replace(fruitRegex, (fullMatch, group1) => { // Pass the capture group directly to formatGroup inside the template literal return `My favorite fruit is ${formatGroup(group1)}`; }); console.log(result); // Output: My favorite fruit is [APPLE]
The key here is that the callback receives the capture groups as named parameters (like group1 above), which you can then pass to any function while building your template literal output.
Question 2: Converting Date Format with Leading Zero Padding
For your date conversion task—turning <month>/<day>/<year> (with optional single-digit values) into <day>/<month>/<year> with leading zeros for single-digit days/months—we can combine regex capture groups, a helper function for padding, and replace() with a callback.
Step 1: The Regex
First, a regex to match your date format. This will capture the month, day, and year as separate groups:
const dateRegex = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
(\d{1,2}): Captures 1 or 2 digits for the month(\d{1,2}): Captures 1 or 2 digits for the day(\d{4}): Captures exactly 4 digits for the year
Step 2: Padding Helper Function
Create a simple function to add a leading zero to single-digit values:
function padZero(num) { // Convert to string first, then pad to 2 characters with '0' return num.toString().padStart(2, '0'); }
Step 3: Replace and Format
Use replace() with a callback to swap the month/day positions and apply padding:
const originalDate = "3/5/2024"; const formattedDate = originalDate.replace(dateRegex, (fullMatch, month, day, year) => { // Swap day and month, pad both, then build the new date string return `${padZero(day)}/${padZero(month)}/${year}`; }); console.log(formattedDate); // Output: 05/03/2024
Bonus: Batch Processing Multiple Dates
If you have an array of dates, you can process them all at once with map():
const dateList = ["1/1/2024", "12/31/2023", "5/10/2024"]; const formattedDates = dateList.map(date => date.replace(dateRegex, (_, month, day, year) => `${padZero(day)}/${padZero(month)}/${year}`) ); console.log(formattedDates); // Output: ["01/01/2024", "31/12/2023", "10/05/2024"]
Note: We used _ as a throwaway variable for the full matched string since we don't need it here.
内容的提问来源于stack exchange,提问作者Matus Dubrava

