import re
regex = re.compile(r"^(?:[\s]+)?(?:const|let|var|)?(?:[a-z0-9.]+(?:\.prototype)?)?(?:\s)?(?:[a-z0-9-_{}:\s]+\s?=)?\s?(?:[a-z0-9]+\s+\:\s+)?(?:function\s?)?(?:[a-z0-9_-]+)?\s?\(.*\)\s?(?:.+)?([=>]:)?\{(?:(?:[^}{]+|\{(?:[^}{]+|\{[^}{]*\})*\})*\}(?:\s?\(.*\)\s?\)\s?)?)?(?:\;)?$", flags=re.IGNORECASE | re.MULTILINE)
test_str = ("/**\n"
" * @function\n"
" * @description simple method that tries to retrieve a config value from the format\n"
" * if it exists, else it will return the second argument as the default value.\n"
" * @param {string} prop - the prop name to retrieve\n"
" * @param {any} defaultValue - the value to use if we can't extract from the format\n"
" * @returns {any} - the default value or extracted format value\n"
" */\n\n\n"
"const a = {\n"
" apples() {\n\n"
" },\n"
" apples2 : function() {\n"
" },\n"
" apples3 : () => {\n"
" }\n"
"}\n\n"
"function(){}\n\n"
"function() {}\n\n"
"function() { }\n"
"function () { }\n"
"function (arg, asdf) { }\n"
"function (arg, asdf):Typings { }\n"
"function (arg, asdf):something<Else> { }\n\n"
"function () { }\n"
"const x = function () { }\n"
"const { x } = function () { }\n\n"
"const { x: asdf } = function () { }\n\n"
"const filterFn = () => {}\n\n"
"// won't grab\n"
"const filterFn = apples.filter(() => {});\n"
"// won't grab\n"
"const filterFn = apples.filter(function(){});\n\n\n\n"
"class Bla {\n"
" constructor() {\n"
" }\n"
" someMethod1() {\n"
" }\n"
" someMethod2() => {\n"
" }\n"
" get someMethod3() {\n"
" }\n"
"}\n\n\n"
"/**\n"
" * @function\n"
" * @description simple method that tries to retrieve a config value from the format\n"
" * if it exists, else it will return the second argument as the default value.\n"
" * @param {string} prop - the prop name to retrieve\n"
" * @param {any} defaultValue - the value to use if we can't extract from the format\n"
" * @returns {any} - the default value or extracted format value\n"
" */\n"
"HoverBoard.prototype.getFormatValueIfExists = function (prop, defaultValue) {\n"
" try {\n"
" return typeof this.config.formats[this.name][prop] !== 'undefined' ? this.config.formats[self.name][prop] : defaultValue;\n"
" } catch (e) {\n"
" return defaultValue;\n"
" }\n"
"};\n\n"
"/**\n"
" * @function\n"
" * @description simple method that tries to retrieve a config value from the format\n"
" * if it exists, else it will return the second argument as the default value.\n"
" * @param {string} prop - the prop name to retrieve\n"
" * @param {any} defaultValue - the value to use if we can't extract from the format\n"
" * @returns {any} - the default value or extracted format value\n"
" */\n"
"const getFormatValueIfExists = function (prop, defaultValue) {\n"
" try {\n"
" return typeof this.config.formats[this.name][prop] !== 'undefined' ? this.config.formats[self.name][prop] : defaultValue;\n"
" } catch (e) {\n"
" return defaultValue;\n"
" }\n"
"};\n\n"
"/**\n"
" * @function\n"
" * @description simple method that tries to retrieve a config value from the format\n"
" * if it exists, else it will return the second argument as the default value.\n"
" * @param {string} prop - the prop name to retrieve\n"
" * @param {any} defaultValue - the value to use if we can't extract from the format\n"
" * @returns {any} - the default value or extracted format value\n"
" */\n"
" var getFormatValueIfExists = (prop, defaultValue) => {\n"
" try {\n"
" return typeof this.config.formats[this.name][prop] !== 'undefined' ? this.config.formats[self.name][prop] : defaultValue;\n"
" } catch (e) {\n"
" return defaultValue;\n"
" }\n"
"};\n\n"
"/**\n"
" * @function\n"
" * @description simple method that tries to retrieve a config value from the format\n"
" * if it exists, else it will return the second argument as the default value.\n"
" * @param {string} prop - the prop name to retrieve\n"
" * @param {any} defaultValue - the value to use if we can't extract from the format\n"
" * @returns {any} - the default value or extracted format value\n"
" */\n"
"window.x = (prop, defaultValue) => {\n"
" try {\n"
" return typeof this.config.formats[this.name][prop] !== 'undefined' ? this.config.formats[self.name][prop] : defaultValue;\n"
" } catch (e) {\n"
" return defaultValue;\n"
" }\n"
"};\n\n"
"/**\n"
" * @function\n"
" * @description simple method that tries to retrieve a config value from the format\n"
" * if it exists, else it will return the second argument as the default value.\n"
" * @param {string} prop - the prop name to retrieve\n"
" * @param {any} defaultValue - the value to use if we can't extract from the format\n"
" * @returns {any} - the default value or extracted format value\n"
" */\n"
"something.else.x = (prop, defaultValue) => {\n"
" try {\n"
" return typeof this.config.formats[this.name][prop] !== 'undefined' ? this.config.formats[self.name][prop] : defaultValue;\n"
" } catch (e) {\n"
" return defaultValue;\n"
" }\n"
"};\n\n\n"
"/**\n"
" * @function\n"
" * @description simple method that tries to retrieve a config value from the format\n"
" * if it exists, else it will return the second argument as the default value.\n"
" * @param {string} prop - the prop name to retrieve\n"
" * @param {any} defaultValue - the value to use if we can't extract from the format\n"
" * @returns {any} - the default value or extracted format value\n"
" */\n"
"var x = null;\n"
"x = (prop, defaultValue) => {\n"
" try {\n"
" return typeof this.config.formats[this.name][prop] !== 'undefined' ? this.config.formats[self.name][prop] : defaultValue;\n"
" } catch (e) {\n"
" return defaultValue;\n"
" }\n"
"};\n\n\n"
"/**\n"
" * @function\n"
" * @description simple method that tries to retrieve a config value from the format\n"
" * if it exists, else it will return the second argument as the default value.\n"
" * @param {string} prop - the prop name to retrieve\n"
" * @param {any} defaultValue - the value to use if we can't extract from the format\n"
" * @returns {any} - the default value or extracted format value\n"
" */\n"
"function getFormatValueIfExists(prop, defaultValue) {\n"
" try {\n"
" return typeof this.config.formats[this.name][prop] !== 'undefined' ? this.config.formats[self.name][prop] : defaultValue;\n"
" } catch (e) {\n"
" return defaultValue;\n"
" }\n"
"};\n\n"
"/**\n"
" * @function\n"
" * @description simple method that tries to retrieve a config value from the format\n"
" * if it exists, else it will return the second argument as the default value.\n"
" * @param {string} prop - the prop name to retrieve\n"
" * @param {any} defaultValue - the value to use if we can't extract from the format\n"
" * @returns {any} - the default value or extracted format value\n"
" */\n"
"function (prop, defaultValue) {\n"
" try {\n"
" return typeof this.config.formats[this.name][prop] !== 'undefined' ? this.config.formats[self.name][prop] : defaultValue;\n"
" } catch (e) {\n"
" return defaultValue;\n"
" }\n"
"};\n\n"
"/**\n"
" * @function\n"
" * @description simple method that tries to retrieve a config value from the format\n"
" * if it exists, else it will return the second argument as the default value.\n"
" * @param {string} prop - the prop name to retrieve\n"
" * @param {any} defaultValue - the value to use if we can't extract from the format\n"
" * @returns {any} - the default value or extracted format value\n"
" */\n"
"(prop, defaultValue) => {\n"
" try {\n"
" return typeof this.config.formats[this.name][prop] !== 'undefined' ? this.config.formats[self.name][prop] : defaultValue;\n"
" } catch (e) {\n"
" return defaultValue;\n"
" }\n"
"};\n\n"
"/**\n"
" * @function\n"
" * @description simple method that tries to retrieve a config value from the format\n"
" * if it exists, else it will return the second argument as the default value.\n"
" * @param {string} prop - the prop name to retrieve\n"
" * @param {any} defaultValue - the value to use if we can't extract from the format\n"
" * @returns {any} - the default value or extracted format value\n"
" */\n"
"((prop, defaultValue) => {\n"
" try {\n"
" return typeof this.config.formats[this.name][prop] !== 'undefined' ? this.config.formats[self.name][prop] : defaultValue;\n"
" } catch (e) {\n"
" return defaultValue;\n"
" }\n"
"}());\n\n\n\n\n"
"/**\n"
" * @function\n"
" * @description simple method that tries to retrieve a config value from the format\n"
" * if it exists, else it will return the second argument as the default value.\n"
" * @param {string} prop - the prop name to retrieve\n"
" * @param {any} defaultValue - the value to use if we can't extract from the format\n"
" * @returns {any} - the default value or extracted format value\n"
" */\n"
"((prop, defaultValue) => {\n"
" try {\n"
" return typeof this.config.formats[this.name][prop] !== 'undefined' ? this.config.formats[self.name][prop] : defaultValue;\n"
" } catch (e) {\n"
" return defaultValue;\n"
" }\n"
"} (window) );\n\n")
matches = regex.finditer(test_str)
for match_num, match in enumerate(matches, start=1):
print(f"Match {match_num} was found at {match.start()}-{match.end()}: {match.group()}")
for group_num, group in enumerate(match.groups(), start=1):
print(f"Group {group_num} found at {match.start(group_num)}-{match.end(group_num)}: {group}")
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 Python, please visit: https://docs.python.org/3/library/re.html