2011-12-18 5 views
-1

C11++ regexを使ってトークンにCSSファイルを分割し、キー/値としてstd :: mapに挿入する方法を知りたいですか?C++ 11の正規表現を使用してトークン上のcssファイルを分割する方法は?

CSSファイル:

#id1 { 
    border: 1px; 
    color: red; 
} 
#id2 { 
    border: 2px; 
    color: green; 
}; 

C++コード:

#include <iostream> 
#include <fstream> 
#include <map> 
#include <regex> 
using namespace std; 

int main() { 
    ifstream file("file.css", ios::binary); 

    if(!file.is_open()) 
     return 1; 

    //... how to split file on tokens? 

    //and insert tokens probably like this (but only in a loop and dynamically): 
    map<string, string> array; 
    array.insert(make_pair("#id1", "border: 1px; color: red;")); 
    array.insert(make_pair("#id2", "border: 1px; color: green;")); 
    //... 

    map<string, string>::iterator i = array.begin(); 

    while(i != array.end()) { 
     cout << "key: " << i->first << " | value: " << i->second << endl; 
     i++; 
    } 

    //out: 
    /* 
    key: #id1 | value: border: 1px; color: red; 
    key: #id2 | value: border: 2px; color: green; 
    */ 
    return 0; 
} 

私はJavaScriptの実装に必要なもの:実際には

var css = "\ 
    #id1 {\ 
     border: 1px;\ 
     color: red;\ 
    }\ 
    #id2 {\ 
     border: 2px;\ 
     color: green;\ 
    }"; 

//remove tabulation and split on tokens 
var array = css.replace(/[\t\n\r]*/g, '').replace(/\s{2}/g, ' ').split('}'), 
    i = array.length-1, 
    stack = []; 

//close right brace and insert into stack[] 
while(i--) { 
    stack.unshift(array[i] + "}"); 
} 

i = stack.length; 

var map = {}; 

//fill map (key/value) 
while(i--) { 
    map[stack[i].match(/(.*){.*}/)[1]] = stack[i].match(/.*{(.*)}/)[1]; 
} 
//out 
for(i in map) { 
    document.write('key: ' + i + ' | value: ' + map[i] + '<br />') 
} 

Please see working example

、私はちょうど必要シム正規表現を使用した分割CSSファイルの例

+0

gccが、すべての標準が必要とする機能を持つのstd :: regex' '実装がありますか? – Nawaz

+4

これのどの部分がわかりにくいのですか?C++で ''を使用する方法、または実際の正規表現をどのようにするべきですか?それぞれはまっすぐな答えを持っていますが、これはあまりにも多くの "私のための私の全体のプログラムを書いてください"タイプ質問があります。 –

+0

私はGCC 4.7の最新バージョンを持っています。実際には、正規表現 – Algorithm

答えて

0

RegEx match open tags except XHTML self-contained tagsと同様に、CSSなどの言語を解析するために正規表現を使用しないでください。代わりに、ANTLRのようなものを考えてください。これは適切なパーサジェネレータであり、少なくとも正しい結果を与えることができます。

+0

私は正規表現の使用はCSSを解析するための良い習慣ではないことを理解します。しかし、私の場合はより適切です – Algorithm

+0

"銃器の使用は夕食後にテーブルを空けるのは良い習慣ではないと理解していますが、私の場合はもっと適しています。"それは、少なくとも、詳細な説明がなくても(おそらくあなたは手を持たないが、足で銃器を操作することができ、あなたの家族は何世代にもわたりこのようにしている) –

+0

JavaSctiptに必要なものと同じ例を示しましたが、C++で同じことをする方法を知りたいのですが – Algorithm

0

Johnが述べたように、適切なパーサーを書くことを検討する必要があります。

boost :: spiritを見てください。このチュートリアルでは、XMLを抽象構文ツリーに読み込むための単純なパーサーを作成する方法を示します。

http://www.boost.org/libs/spirit/

+0

ありがとう、私はboost :: spirit(偉大なライブラリ)について知っていますが、自分でそれを解析したい。私はほぼ完成してすぐに結果を表示しました – Algorithm

関連する問題