#javascript #regex
#javascript #регулярное выражение
Вопрос:
Я использую Javascript.
У меня есть файл, который может быть таким:
/* Loaded modules -- end */
class Element extends One(Two(PageElement)) {
static get pagePath () { return [ '/elelel'] }
static get styles () {
Или вот так:
/* Loaded modules -- end */
class Element extends PageElement {
static get pagePath () { return [ '/elelel'] }
static get styles () {
Я хочу найти PageElement
в обоих случаях, используя регулярное выражение Javascript.
Я здесь:
contents.match(/^[ t]*class[ t] w [ t] extends[ t] (.*)$/m)
Первое совпадение в скобках One(Two(PageElement)) {
. У меня возникают реальные проблемы с подбором соответствия PageElement
— тем более, что этого One(Two(
(и завершающих закрывающих скобок) может и не быть.
Комментарии:
1. Почему вы все равно пытаетесь разобрать javascript с помощью регулярных выражений?
2. Генератор кода. github.com/mobily-enterprises/js-kit
Ответ №1:
Использовать:
/^s*classs w s extendss (:?w s*(s*)*(w )[s)]*/m
Шаблон w s*(
соответствует токену, за которым следует (
(с необязательным пробелом вокруг (
. Эта группа, за которой следует, *
допускает любое их количество (не включая 0, поэтому они необязательны).
И [s)]*
допускает любое число )
после имени суперкласса (опять же, с необязательными пробелами).
function get_superclass(content) {
let match = content.match(/^s*classs w s extendss (?:w s*(s*)*(w )[s)]*/m);
if (match) {
return match[1];
}
}
console.log(get_superclass(`/* Loaded modules -- end */
class Element extends PageElement {
static get pagePath () { return [ '/elelel'] }
static get styles () {`));
console.log(get_superclass(`/* Loaded modules -- end */
class Element extends One(Two(PageElement)) {
static get pagePath () { return [ '/elelel'] }
static get styles () {`));
Ответ №2:
Попробуйте использовать приведенное ниже регулярное выражение.
^[ t]*class[ t] w [ t] extends[ t] (?:w ()*(w )[)s]*{$
Группа без (?:w ()*
захвата захватывает любой набор символов, за которым следует открытая скобка, и удаляет его из фактических данных, которые нам нужно захватить, и аналогичным [)s]*
образом будет соответствовать любым закрывающим скобкам, если они доступны, следовательно, оставляя нам точное имя класса, которое мы ищем.