2017-02-16 4 views
-1

テキスト1をテキスト2に変更したい。どうすれば正規表現を書くことができますか?テキストにはサブセクションが含まれています。新バージョンコンマ中括弧の正規表現

で区切られるべき

テキスト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) 
    | 
     .* 
) 

を交換して下さいそうしないと、複雑な再帰的な正規表現なしのネスト情報を取得することはできません。

または、単純な関数再帰で言語を使用します。あなたは、関数本体では機能

を再帰的に$ 1が空でない場合は、正規表現\s*{([^\s{}]+)\s*|\s*{([^{}]+)}\s*|\s*}\s*

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

に基づいて適切な行動を取る、アレイ上にそれをプッシュし、その後、同じ機能(再帰)を呼び出します。

$ 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 
*/ 
関連する問題