2016-09-19 2 views
0

Я использую /<?=>|[^\s\w]|\w+/g, чтобы соответствоватьРекурсивный регулярное выражение матч

  • < =>
  • =>
  • слова/буквы

, но я также хочу, чтобы соответствовать K(a,...) где a может быть любое слово/letter и ... может быть любым, что также соответствует этому финальному регулярному выражению. Поэтому на самом деле это должно быть рекурсивным.

Таким образом, новое регулярное выражение должно соответствовать

  • < =>
  • =>
  • слова/буквы
  • К (а, ...)

где это ... матчи

  • < =>
  • =>
  • слова/буквы
  • К (а, ...)

и так далее ...

Я не уверен, если это возможное.

Я не уверен, что может быть проще создать функцию, которая прогуливается по каждому символу в строке рекурсивно, которая является чем-то вроде https://en.wikipedia.org/wiki/Recursive_descent_parser

+2

Javascript регулярное выражение не поддерживает рекурсивный шаблон, лучше, чтобы написать парсер, как вы предлагаете. – anubhava

+0

Вы можете попробовать использовать библиотеку http://xregexp.com/. – Karpak

+0

@ Karpak Зачем нужна помощь xregexp? –

ответ

0

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

/(K\(.+,(.+)\)|<?=>)|\w+\1/g 
0

Регулярное выражение, используемое в приведенном ниже javascript, не использует рекурсию.
Так как это не доступно в стандартном регулярном выражении javascript.

Он использует то, что все ) находятся в конце.
Как в строке примера из комментариев.

var str = "ps<=>q=>pb=>K(ab,K(b,K(c,p => q))) not)"; 
 

 
var re = /\w+(?:\([^()]+)+[)]+|<?=>|\w+(?=<?=>)/g; 
 

 
var matchArray = []; 
 
var m; 
 

 
while (m = re.exec(str)) { 
 
    matchArray.push(m[0]); 
 
} 
 

 
console.log(matchArray);

Смежные вопросы