const regex = new RegExp('^(?:\\((?P<imp>[A-Z])\\)\\ )?(?P<dued>(?:2[0-1][0-9]{2}\\-(?:0[0-9]|1[0-2])\\-(?:[0-2][0-9]|3[0-1]))|\\?)\\ (?:\\+(?P<proname>[a-zA-Z0-9]+)(?:\\#(?P<pronum>[0-9]+))?\\ )?(?:\\$(?P<startd>2[0-1][0-9]{2}\\-(?:0[0-9]|1[0-2])\\-(?:[0-2][0-9]|3[0-1]))(?:\\^(?P<repeat>\\d*(?:D|W|M|Y)(?:\\,\\d*(?:D|W|M|Y)+)*))?\\ )?(?P<todo>.+?(?=(?:\\ (?:\\@|\\&))|$))(?P<contexts>(?:\\ \\@\\S+)*)(?P<tags>(?:\\ \\&\\S+)*)', 'gm')
const str = `(A) 2016-10-23 +projectB \$2016-10-03 to be completed as soon as possible @context_bar
(A) 2016-11-01 +projectA \$2016-09-25 job to complete @context @context_two
(B) ? +houseworks \$2016-10-04^2D,W lavoro importante &TAG_FOO &TAG_BAR
2016-12-15 +projectA#2 \$2016-09-25 second job related to the same project @another_context
? +houseworks \$2016-10-02^3D altro lavoro di casa @context_bar &TAG
? +projectA#3 \$2016-09-25 third job of the same project @foo_context &WAIT
? +projectA#4 \$2016-09-25 fourth job, needs third to be completed first
2016-11-23 \$2015-06-23^4Y another job without project @context_foo @context_bar &TAG_A &TAG_B
? minimal job like email fra@me.com`;
// 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