Сократите регулярное выражение в одну подходящую группу - PullRequest
0 голосов
/ 23 мая 2018

В настоящее время я использую RegExp (?:\(\) => (.*)|return (.*);) для пользовательской функции nameof, которая вызывается так: nameof(() => myVariable).В зависимости от исполнения, хотя лямбда переносится во что-то, содержащее часть return myVariable;, поэтому мне нужна альтернативная ветвь, ищущая return.

Транспортированный вывод будет иметь вид ()=>{cov_26zslv4jy3.f[9]++;cov_26zslv4jy3.s[38]++;return options.type;}.

Примерами являются следующие:

// should return "foo"
() => foo
// should return "foo.bar"
() => foo.bar
// should return "options.type"
()=>{cov_26zslv4jy3.f[9]++;cov_26zslv4jy3.s[38]++;return options.type;}

Мой текущий RegExp работает, однако он имеет две совпадающие группы в зависимости от типа того, была ли лямбда перенесена или нет.Можно ли переписать выражение так, чтобы у меня была одна совпадающая группа, которая будет содержать имя?


Для более подробной информации я приложил полный код своей функции:

const nameofValidator: RegExp = new RegExp(/(?:\(\) => (.*)|return (.*);)/);

/**
 * Used to obtain the simple (unqualified) string name of a variable.
 * @param lambda A lambda expression of the form `() => variable` which should be resolved.
 */
export function nameof<TAny>(lambda: () => TAny): string {
    const stringifiedLambda: string = String(lambda);
    const matches: RegExpExecArray | null = nameofValidator.exec(stringifiedLambda);
    if (matches === null) {
        throw new ArgumentException("Lambda expression must be of the form `() => variable'.", nameof(() => lambda));
    }

    if (matches[1] !== undefined) {
        return matches[1];
    }
    if (matches[2] !== undefined) {
        return matches[2];
    }

    throw new ArgumentException("Lambda expression must be of the form `() => variable'.", nameof(() => lambda));
}

1 Ответ

0 голосов
/ 23 мая 2018

Вы можете использовать:

(?:\(\) =>|.*return) ([^;\r\n]*)

Если первая сторона чередования не найдена, двигатель пробует вторую.Если мы знаем, что одно условие должно удовлетворять двигателю в любое время, жадная точка .* сделает это раньше.Вам также может понадобиться ^ якорь.

Демонстрационная версия

Также существует второй подход:

\(\) *=>.* ([^;\r\n]+)
...