Каков наилучший способ разбить строку (возможно со сложным регулярным выражением)?(JavaScript / JQuery) - PullRequest
0 голосов
/ 05 марта 2012

Я создаю рекурсивную функцию js, которая в основном анализирует строку.Я не могу выбрать синтаксис строки, поэтому я не могу это изменить.он разделен символом «,», который работает нормально, ожидайте, когда они в скобках, он должен игнорировать внутри скобок, в этом случае он должен разделяться после скобок.Вот пример.

String: "h5, h7, (h5, h7, r3)7, h9"

И его нужно преобразовать в массив строк, который выглядит как

array(
"h5",
"h7",
"(h5, h7, r3)7", 
"h9"
);

Я знаю, что, вероятно, есть способ сделать это с помощью регулярных выражений,и у меня есть очень базовые знания регулярных выражений, но я не могу понять это.Если это поможет, вот код js, который у меня есть.

cols = pattern.split(',');// This is where the regex would go.
                $.each(cols, function(index, val){
                val = $.trim(val);
                    var type = "";
                    var ctr = 0;
                    for(ctr = 0; ctr < val.length && isAlpha(val[ctr]); ctr++)
                        type += val[ctr];
                    if(val[0] == "("){
                        open = 1;
                        substr = "";
                        i = 1;
                        for(; i < val.length && open > 0; i++ ){
                            if(val[i] == ")"){
                                open--;
                            }
                            else
                                substr += val[i];
                        }
                    var repeater = val.substr(i);
                    if(isNumeric(repeater)){
                        for(j=0; j < repeater; j++){
                          colLen += updateRow(row, substr, false);
                        }
                    }
                    else{
                        $('#'+row).append('<a href="" >SE</a>');
                        colLen++;
                    }
                }
               // If it doesn't start with a parenthesis, do print it as usual

Очевидно, что кода гораздо больше, но это важная часть.

Извините Если я отформатировал его неправильно, этомой первый вопрос.

Ответы [ 4 ]

1 голос
/ 05 марта 2012

Если бы не запятая, вы могли бы использовать функцию .split(','). Я полагаю, что разделитель не должен появляться в строке как неэкранированный, но если вы не можете ничего с этим поделать, вы можете использовать это:

[^,]*\([^\)]*\)[^,]*|[^,]+

Соответствует чему-либо в круглых скобках (которые могут содержать символы без запятой) или непрерывному набору символов без запятой. Он будет соответствовать только содержимому, разделенному запятыми, а не самим запятым.

1 голос
/ 05 марта 2012

Вот пара методов грубой силы, которые работают:

Метод 1: Сопоставьте заключенные в скобки части и временно замените запятые внутри чем-то другим, чтобы потом разделить их запятой, а затемвставьте запятые обратно в скобки.

var data = "h5, h7, (h5, h7, r3)7, h9";

var temp = data.replace(/\([^)]+\)/, function(match) {
    return(match.replace(/,/g, "xx!xx"));
});

var splitData = temp.split(/\s*,\s*/);
for (var i = 0; i < splitData.length; i++) {
    splitData[i] = splitData[i].replace(/xx!xx/g, ",");
}

// splitData = ["h5", "h7", "(h5, h7, r3)7", "h9"]

Метод 2: Разделите всю строку запятой, а затем снова соедините скобки:

var data = "h5, h7, (h5, h7, r3)7, h9";

var splitData = data.split(",");
var output = [], pieces, inParen = false;
for (var i = 0; i < splitData.length; i++) {
    temp = splitData[i];
    if (inParen) {
        pieces += "," + temp;
        if (temp.indexOf(")") != -1) {
            inParen = false;
            output.push(pieces);
        }
    } else {
        temp = $.trim(temp);
        if (temp.indexOf("(") != -1) {
            pieces = temp;
            inParen = true;
        } else {
            output.push(temp);
        }
    }
}

// output = ["h5", "h7", "(h5, h7, r3)7", "h9"]

Вы можете увидеть обе эти работы здесь: http://jsfiddle.net/jfriend00/cs224/

0 голосов
/ 05 марта 2012

вы можете попробовать чередование с специальным | нормальным порядком, при котором вы сначала пытаетесь сопоставить хитрые подстроки в скобках, а в противном случае - нормальное:

var data = "h5, h7, 9(h5, h7, r3)7, h9";
var myregexp = /([^,]*?\([^)]*\)[^,]*|[^,]+)/g;
var match = myregexp.exec(data);
var result = "spans found:\n";
while (match != null) {
    result += "match:" + RegExp.$1 + '\n';
    match = myregexp.exec(data);
}
alert(result);

edit : снял \w+ (буквенно-цифровые символы) в пользу: [^,] (без запятых)

0 голосов
/ 05 марта 2012

Хитрость в том, что вы не хотите использовать split() для этого - вместо этого вы просто хотите сопоставить регулярное выражение несколько раз. Будет работать что-то вроде следующего регулярного выражения:

/\([^)]+\)|[^,]+/

(Сопоставьте пару паренов с чем-то промежуточным или с символом, не содержащим запятую.)


var re = /\([^)]+\)[^,]*|[^,]+/g;
var items = input_string.match(re);

http://www.regular -expressions.info / javascript.html

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