Соответствует оператору open и closed ({и} -i sh) - PullRequest
0 голосов
/ 13 июля 2020

У меня есть файл со списком функций и глобальных постоянных переменных.

const native func foo takes nothing returns nothing
const native func bar takes nothing returns nothing

public

   const boolean foo1 = false
   const boolean bar1 = true

   // etc etc ..... (comment line)

   const text foo68 = "Hello"
   const text bar69 = "World"

   const   int _pi = 3.14159265359
   const   int        _tau = 2*_pi

endpublic

const native func xxx takes text str returns boolean
const native func yyy takes int val returns text
native func zzz takes float val returns int

public

   // check if it works for multiple public.
   const text heh = "hello"
   const text  hehe = zero

endpublic

const native func qqq takes text str returns int

Это мое текущее регулярное выражение.

(?:const\s+\w+\s+)(\w+)

Моя цель - получить имя переменной внутри public и endpublic.

Результат должен быть таким:

foo1
bar1
foo68
bar69
heh
hehe

Можно ли сопоставить строку внутри указанных c open и закрывающий тег? Если да, то как?

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Использование matchAll для применения регулярного выражения и сбора всех результатов без использования exe c в al oop. Просто так удобнее. См. Таблицу совместимости внизу. Поддержка относительно нова.

Regex для извлечения из publi c (<->) endpubli c, а затем использование flatMap для применения другого регулярного выражения для извлечения имен констант и сглаживания всех приводит к одному массиву. Изменено с \ w на [a-zA-Z0-9], чтобы не включать в них имена с _. ... оператор распространения для сбора результатов в массив, поэтому я могу использовать flatMap и отображать их.

console.log(
[...data.matchAll(/public([\S\s]*?)endpublic/g)].flatMap(
  pub => [...pub[1].matchAll(/(?:const\s+\w+\s+)([a-zA-Z0-9]+)/g)].map(x=>x[1]))
)
<script>
data = `const native func foo takes nothing returns nothing
const native func bar takes nothing returns nothing

public

   const boolean foo1 = false
   const boolean bar1 = true

   // etc etc ..... (comment line)

   const text foo68 = "Hello"
   const text bar69 = "World"

   const   int _pi = 3.14159265359
   const   int        _tau = 2*_pi

endpublic

const native func xxx takes text str returns boolean
const native func yyy takes int val returns text
native func zzz takes float val returns int

public

   // check if it works for multiple public.
   const text heh = "hello"
   const text  hehe = zero

endpublic

const native func qqq takes text str returns int`
</script>
0 голосов
/ 13 июля 2020

Можно ли сопоставить строку внутри указанного c тега открытия и закрытия? Если да, то как?

Помните, что регулярное выражение - лишь один из многих инструментов, доступных нам, программистам. Его можно смешивать с любым из этих инструментов. Например, один из способов решить вашу проблему - использовать два цикла, в одном из которых используется регулярное выражение:

  1. Прочитайте каждую строку, пока не найдете «publi c»
  2. Прочтите каждую строка для анализа имени переменной с вашим регулярным выражением, пока вы не найдете «endpubli c»
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...