2017-02-16 3 views
-1

Я хочу изменить Text1 на Text2. Как я могу написать регулярное выражение, если это возможно. Текст содержит подраздел. Новая версия должна быть отделена запятойРегулярное выражение для фигурных скобок

Текст1:

{Any 
    {White-collar 
     {Exec-managerial} 
     {Prof-specialty} 
     {Sales} 
     {Adm-clerical} 
    } 
    {Blue-collar 
     {Tech-support} 
     {Craft-repair} 
     {Machine-op-inspct} 
     {Handlers-cleaners} 
     {Transport-moving} 
     {Priv-house-serv} 
    } 
    {Other 
     {Protective-serv} 
     {Armed-Forces} 
     {Farming-fishing} 
     {Other-service} 
    } 
} 

Текст2

Exec-managerial,White-collar,Any   
Prof-specialty ,White-collar,Any   
Sales,White-collar,Any 
Adm-clerical,White-collar,Any 
Tech-support,Blue-collar,Any 
Craft-repair,Blue-collar,Any 
Machine-op-inspct,Blue-collar,Any 
Handlers-cleaners,Blue-collar,Any 
Transport-moving,Blue-collar,Any 
Protective-serv,Other,Any 
Armed-Forces,Other,Any 
Farming-fishing,Other,Any 
Other-service,Other,Any 

ответ

0

Если это только внутренний подкосным материал вы хотите оставить, это должно сделать это.

Найти (?s)(?:.*?({[^{}]*})|.*)
Заменить $1\r\n

(?s) 
(?: 
     .*? 
     ({ [^{}]* })    # (1) 
    | 
     .* 
) 

В противном случае, вы не можете получить вложенности информацию без сложного рекурсивного регулярного выражения.

Или используйте язык с простой функцией рекурсии. Вы бы рекурсию функцию

В теле функции, принимать соответствующие меры на основе регулярных выражений \s*{([^\s{}]+)\s*|\s*{([^{}]+)}\s*|\s*}\s*

\s* { 
    ([^\s{}]+)     # (1) 
    \s* 
| 
    \s* 
    { 
    ([^{}]+)     # (2) 
    } 
    \s* 
| 
    \s* } \s* 

Если $ 1 не является пустым, вставьте его в массив, а затем вызвать ту же функцию (рекурсии).

Если $ 2 не пуст, создайте временную строку, добавьте все элементы в массиве,
получите следующее совпадение.

Если оба $ 1 и $ 2 пустые, удалите последний элемент, добавленный в массив,
, затем выполните возврат из функции.

Это все, что нужно.
(псевдокод)

function recurse(string_thats_left) 
{ 
    while (match(string_thats_left, regex)) 
    { 
     if ($1 matched) 
     {  
      push $1 onto array 
      recurse(match position to end of string); 
     } 
     else 
     if ($2 matched) 
     { 
      write $2 to output 
      for (sizeof array) 
       append "," + element to output 
     } 
     else 
     { 
      pop the last array element 
      return 
     } 
    } 
} 

Существует на самом деле больше, чем это, как и матчи должны быть последовательными
без перерывов, но это дает идею.

1

Вы можете преобразовать структуру данных в формате JSON, а затем использовать ваши любимые карты/уменьшить методы обхода его ...

// define input text 
var Text1 = `{Any 
    {White-collar 
     {Exec-managerial} 
     {Prof-specialty} 
     {Sales} 
     {Adm-clerical} 
    } 
    {Blue-collar 
     {Tech-support} 
     {Craft-repair} 
     {Machine-op-inspct} 
     {Handlers-cleaners} 
     {Transport-moving} 
     {Priv-house-serv} 
    } 
    {Other 
     {Protective-serv} 
     {Armed-Forces} 
     {Farming-fishing} 
     {Other-service} 
    } 
}` 

// define output array to store lines 
var output = [] 
// parse json string into plain javascript object 
JSON.parse(
    // wrap input in array 
    '[' + Text1 
     // replace opening braces with name/children json structure 
     .replace(/{([\w-]+)/g, '{"name": "$1", "children": [') 
     // replace closing braces with array close 
     .replace(/}/g, ']}') 
     // add commas between closing and opening braces 
     .replace(/}([\n\s]*){/g, '},$1{') + ']' 
// loop through outer layer 
).forEach(outer => outer.children 
    // inner layer 
    .forEach(middle => middle.children 
     // and finally join all keys with comma and push to output 
     .forEach(inner => output.push([inner.name, middle.name, outer.name].join(','))) 
    ) 
) 

// join output array with newlines, and assign to Text2 
var Text2 = output.join('\n') 

/* Text2 => 
Exec-managerial,White-collar,Any 
Prof-specialty,White-collar,Any 
Sales,White-collar,Any 
Adm-clerical,White-collar,Any 
Tech-support,Blue-collar,Any 
Craft-repair,Blue-collar,Any 
Machine-op-inspct,Blue-collar,Any 
Handlers-cleaners,Blue-collar,Any 
Transport-moving,Blue-collar,Any 
Priv-house-serv,Blue-collar,Any 
Protective-serv,Other,Any 
Armed-Forces,Other,Any 
Farming-fishing,Other,Any 
Other-service,Other,Any 
*/ 
Смежные вопросы