Найти имя базового класса в определении класса с помощью регулярного выражения

#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]* образом будет соответствовать любым закрывающим скобкам, если они доступны, следовательно, оставляя нам точное имя класса, которое мы ищем.