import re
regex = re.compile(r"(?<=^|[\n;](?:[\t ]*(?:\w+ )?)?)export\s*(?<modifiers>(?:\s*declare|\s*abstract|\s*async)+)?\s*(?<declaration>class|const +enum|const|enum|function\*?|interface|let|namespace|type(?! *\{)|var)\s+(?<exports>(?:[$_\p{ID_Start}][$\u200C\u200D\p{ID_Continue}]*(?=[\s=:;/({])(?!.*?,))|(?:[\w\t\n\r .,:$'\"=-]+)|(?:[{[][\w\t\n\r .,:$'\"-]+[}\]]))(?:\s*=\s*[$_\p{ID_Start}][$\u200C\u200D\p{ID_Continue}]*)?", flags=re.UNICODE)
test_str = ("export const CJS_SYNTAX_REGEX: RegExp = /pattern/gm;export const IGNORE_PATTERNS: string[] = [];\n"
"export declare const RESOLVE_EXTENSIONS: string[]\n"
"export enum Snack{}\n"
"export const enum Snack {}\n"
"export interface User {}\n"
"export class House {}\n"
"export declare abstract class House extends Building {}\n"
"export abstract class House {}\n"
"export async function run() {}\n"
"export async function* run() {}\n"
"export function foo() {}\n"
"export function* foo() {}\n"
"export const $foo = 42\n"
"export const $foo= 42\n"
"export namespace Foo {}\n"
"export type Foo = 'foo'\n"
"export let name1, name2/*, … */; // also var\n"
"export const name1 = 1, name2 = 2/*, … */; // also var, let\n"
"export function functionName() { /* … */ }\n"
"export class ClassName { /* … */ }\n"
"export function* generatorFunctionName() { /* … */ }\n"
"export const { name1, name2: bar } = o;\n"
"export const [ name1, name2 ] = array;\n\n"
"declare module 'module-name' {\n"
" export declare abstract class Building {}\n"
" export declare class House extends Building {}\n"
"}\n\n"
"\"export const $foo = 42\"\n\n"
"export default async function functionName() { /* … */ }\n"
"export default function functionName() { /* … */ }\n"
"export default function* generatorName() { /* … */ }\n"
"export default async function* generatorNameAsync() { /* … */ }\n"
"export default class ClassName { /* … */ }\n"
"export default abstract class ClassName { /* … */ }\n\n"
"export default function () { /* … */ }\n"
"export default async function () { /* … */ }\n"
"export default function* () { /* … */ }\n"
"export default async function* () { /* … */ }\n"
"export default class { /* … */ }\n\n"
"export default async () => {}\n"
"export default async arg => {}\n"
"export default () => {}\n"
"export default arg => {}\n"
"export default (arg) => {}\n\n"
"export default foo\n"
"export default foo;\n"
"export default 1 + 1;\n\n"
"// export const CJS_SYNTAX_REGEX\n\n"
"/**\n"
" * Resolvable file extensions.\n"
" *\n"
" * @example\n"
" * export const CJS_SYNTAX_REGEX\n"
" */\n\n"
"export type Foo = 'foo'")
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