Как разбить файл css на токены с помощью регулярного выражения C ++ 11? - PullRequest
0 голосов
/ 18 декабря 2011

Я хотел бы знать, как разделить файл css на токены, используя C11 ++ regex и вставить в std :: map как ключ / значение?

Файл 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 />')
}

Пожалуйстасм. рабочий пример

На самом деле, мне просто нужен простой пример расщепления CSS-файла с использованием regex

Ответы [ 2 ]

0 голосов
/ 18 декабря 2011

Как сказал Джон, вам следует подумать о написании правильного парсера.

Взгляните на boost :: spirit.В руководстве показано, как написать простой анализатор для чтения XML в абстрактном синтаксическом дереве.

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

0 голосов
/ 18 декабря 2011

Как и RegEx соответствует открытым тегам, за исключением автономных тегов XHTML , вам не следует использовать регулярные выражения для анализа языка, такого как CSS. Вместо этого рассмотрим что-то вроде ANTLR , который является правильным генератором синтаксического анализатора и, по крайней мере, способен давать правильные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...