const regex = /^[ ]{0,3} # Leading space up to 3
(?<link_all>
(?<!\\)\[ # ID within brackets
(?!\^) # Make sure, this is not confused with a footnote
(?<link_id>.+?)
(?<!\\)\]
[ \t]* # Possibly with some space before colon
\:
[ \t]*\n?[ \t]* # Possibly with some space after the colon, possibly with a new line in between?
(?:
<(?<link_url>[^\>]+)> # link within <>
|
(?<link_url>\S+) # or link without <>
)
(?:
(?:
[ \t]+ # Either some space or tabs
|
[ \t]*\n[ \t]* # or a new line surrounded by 0 or more spaces or tabs
)
(?:
(?:
(?<link_title_container>['"]) # Title is surrounded ether by double or single quotes
(?<link_title>.+?)
\g{link_title_container} # make the sure enclosing mark balance
)
| # or
\((?<link_title>[^\)]+)\) # by parenthesis
)
)?
[ \t]* # Possibly ending with some trailing spaces or tab
)
(?:\n+|\Z) # terminated by a new line or end of file/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('^[ ]{0,3} # Leading space up to 3
(?<link_all>
(?<!\\\\)\\[ # ID within brackets
(?!\\^) # Make sure, this is not confused with a footnote
(?<link_id>.+?)
(?<!\\\\)\\]
[ \\t]* # Possibly with some space before colon
\\:
[ \\t]*\\n?[ \\t]* # Possibly with some space after the colon, possibly with a new line in between?
(?:
<(?<link_url>[^\\>]+)> # link within <>
|
(?<link_url>\\S+) # or link without <>
)
(?:
(?:
[ \\t]+ # Either some space or tabs
|
[ \\t]*\\n[ \\t]* # or a new line surrounded by 0 or more spaces or tabs
)
(?:
(?:
(?<link_title_container>[\'"]) # Title is surrounded ether by double or single quotes
(?<link_title>.+?)
\\g{link_title_container} # make the sure enclosing mark balance
)
| # or
\\((?<link_title>[^\\)]+)\\) # by parenthesis
)
)?
[ \\t]* # Possibly ending with some trailing spaces or tab
)
(?:\\n+|\\Z) # terminated by a new line or end of file', 'gm')
const str = `[1]: /url/ "Title"
[refid]: /path/to/something (Title)
[^block]:
Paragraph.
* List item
> Blockquote
Code block
`;
// Reset `lastIndex` if this regex is defined globally
// regex.lastIndex = 0;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for JavaScript, please visit: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions