const regex = new RegExp('(?<=^|\\v)
\\h*+\\*\\h*+
(?:
(?:
(?P<annotation>
@(?P<name>\\w++)
(?:
(?<=@param)\\h++(?P<type>\\w++(?:\\[\\])?)\\h++\\$(?P<variable>\\w++)
|(?<=@return)\\h++(?P<type>\\w++(?:\\[\\])?)
|(?<=@throws)\\h++(?P<class>\\w++)
|(?<=@cache)\\h++(?P<time>\\d++)
|(?<=@roles)\\h++(?P<roles>\\w++(?:\\h*+,\\h*+\\w++)*)
)?
)
)
(?P<comment>\\h++[^\\v]++)?
(?:(?P<comment>\\v)\\h*+\\*\\h*+(?P<comment>[^\\v@\\h\\*][^\\v]++))*+
|(?P<description>(?:[^\\v@\\h\\*][^\\v]++)
(?:
\\v\\h*+\\*\\h*+[^\\v@\\h\\*][^\\v]++
)*+
)
) ', 'gs')
const str = `/**
* bla bla
*bla2 @ bla2 @
*
* bla bla 3
*
* @olivier voila
* @param string \$sku1 bidule
*
* @param string[] \$sku2
*
* @param string \$sku3 toto bidule @
* machin truc
*
* @param string \$sku4
* machin truc
*
* @deprecated
*
* @deprecated toto
*
* @throws Exception
* @throws Exception
* machin
* @return Cfe_Type_Product
* @cache 3600
* @roles toto, titi,truc , machin
*/`;
// 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