Match nth case with regex
For an app I worked on lately I implemented some Github style checkboxes in their markdown syntax.
The format is like so:
[ ] Checkbox 1
[ ] Checkbox 2
[ ] Checkbox 3
There's a couple ways you could approach this but I've gone with regular expression.
The pattern to match this is: ((\[[ x]].*?(\r\n|\r|\n)){INDEX})\[[ x]](.*)
Where INDEX is the nth we want to match -1. If we want the first, the index would be 0. 2nd would be 1, 3rd would be 2 etc.
E.g. to match the 2nd, the INDEX would be 1: ((\[[ x]].*?(\r\n|\r|\n)){1})\[[ x]](.*)
Then we can use $1[x]$4
as the replacement.
Replacing the 2nd would result in:
[ ] Checkbox 1
[x] Checkbox 2
[ ] Checkbox 3
But let's break this pattern down. The first half of this is in brackets representing the first captured group as $1 for the replace statement. In this we have \[[ x]]
which matches square brackets an empty space or x inside, then .*?
matches any content after it till the end of the line, followed by (\r\n|\r|\n)
which detects the end of the line. This then get's repeated for the INDEX {INDEX}
or {1}
for matching the 2nd checkbox. The INDEX is 1 less than the value we are looking for as it starts at 0 rather than 1. This ends the first capturing group. We then we look for the checkbox again \[[ x]]
as this is the one we will be replacing and grab all the content after it in a last capturing group which in the replace is $4.
Try this out at http://regexr.com/3dqac
Use the original empty checkboxes text above and the regex, then click to replace and enter the replacement script. Then try changing the index between 0, 1 and 2 to see if live replace whichever checkbox.