2017-02-16 49 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,然後用你最喜歡的map/reduce方法來遍歷它...

// 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 
*/