Я пытаюсь собрать RegEx, который возьмет строку с этим форматированием (person,item(bought,paid),shipping(address(city,state))) и превратит ее в строку, отформатированную следующим образом:

person
item
* bought
* paid
shipping
* address
** city
** state

Пока что мое отсутствие понимания RegEx убивает меня. Я начал делать что-то вроде этого ... но это направление не сработает

var stg = "(person,item(bought,paid),shipping(address(city,state)))"
var separators = [' ', '\"\\\(', '\\\)\"', ','];
  stg = stg.split(new RegExp(separators.join('|'), 'g'));

Примечание: строка может двигаться. Я пытаюсь сказать, если (появляется начальный ребенок, добавляя *, если вы видите) близкого ребенка. Я думаю, что это может быть больше для цикла с кучей ifs lol.

2
RooksStrife 11 Янв 2017 в 19:26

3 ответа

Лучший ответ

Вы можете написать свой собственный итератор:

str = '(person,item(bought,paid),shipping(address(city,state)))';
counter = -1;
// Split and iterate
str.split(/([(,)])/).filter(Boolean).forEach(function(element) {
    if (element.match(/^[^(,)]/)) {
    	console.log("*".repeat(counter) + ((counter > 0) ? ' ' : '') + element)
    } else if (element == '(') {
    	counter++;
    } else if (element == ')') {
    	counter--;
    }
});
4
revo 11 Янв 2017 в 17:07

Я не уверен, почему вы хотите, чтобы она была в виде многострочной строки, а не в формате JSON ... Но вот, пожалуйста:

var regex = /\((.*?)\,(.*?)\((.*?),(.*?)\),(.*?)\((.*?)\((.*?),(.*?)\)\)\)/;
var string = '(person,item(bought,paid),shipping(address(city,state)))';

var matches = string.match(regex)

var resultString = matches[1] + "\n";
resultString += matches[2] + "\n" ;
resultString += "* " + matches[3] + "\n" ;
resultString += "* " + matches[4] + "\n" ;
resultString += matches[5] + "\n" ;
resultString += "* " + matches[6] + "\n" ;
resultString += "** " + matches[7] + "\n" ;
resultString += "** " + matches[8];

console.log(resultString);
0
Z-Bone 11 Янв 2017 в 16:38

Вы можете сделать это одним уникальным методом замены:

str='person,item(bought,paid),shipping(address(city,state))';

var asterisks = '';
var result = str.replace(/(\()|(\))|,/g, (match, openP, closingP) => {
    if (openP) {
        return '\n' + (asterisks += '*');
    }
    if (closingP) {
        asterisks = asterisks.slice(1);
        return '';
    }
    // else: is comma
    return '\n' + asterisks;
});

console.log(result);
1
Washington Guedes 11 Янв 2017 в 17:45