const regex = / *(?:.*\S.*\n)+\n? *: +(?:.|\n)+?(?:\n{2,}(?=\S)(?! *: +)(?! *(?:\S.*\n)+?\n? *: +)|$)/g;
// Alternative syntax using RegExp constructor
// const regex = new RegExp(' *(?:.*\\S.*\\n)+\\n? *: +(?:.|\\n)+?(?:\\n{2,}(?=\\S)(?! *: +)(?! *(?:\\S.*\\n)+?\\n? *: +)|$)', 'g')
const str = `=== Single <dt> and <dd>
GitHub
: a site where over 73 million developers shape the future of software, together
=== Multiple <dt>-<dd> group
Firefox
: a free, open source, cross-platform, graphical web browser developed by the Mozilla Corporation and hundreds of volunteers
MDN
: provides information about Open Web technologies including HTML, CSS, and APIs for both Web sites and progressive web apps
=== Single <dt> with multiple <dd>s
Apple
: an American multinational technology company that specializes in consumer electronics, computer software and online services.
: an edible fruit produced by an apple tree
=== Multiple <dt>s
Windows
Microsoft Windows
Win
: a group of several proprietary graphical operating system families, all of which are developed and marketed by Microsoft
=== separated by blank lines
Solaris
: a 1961 science fiction novel by Polish writer Stanisław Lem
: a proprietary Unix operating system originally developed by Sun Microsystems
=== <dd>s with inline breaks
Oracle
: an American multinational computer technology
corporation headquartered in Austin, Texas
: the priest or priestess uttering the prediction,
may also refer to the site of the oracle
===
😂
: 😂 face with tears of joy
===
Term 1
: This is a definition with two paragraphs. Lorem ipsum
dolor sit amet, consectetuer adipiscing elit. Aliquam
hendrerit mi posuere lectus.
Vestibulum enim wisi, viverra nec, fringilla in, laoreet
vitae, risus.
: Second definition for term 1, also wrapped in a paragraph
because of the blank line preceding it.
Term 2
: This definition has a code block, a blockquote and a list.
code block.
> block quote
> on two lines.
1. first list item
2. second list item`;
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